SQL Server语言 - 如何在SQL中使用循环插入多个项



我当前的SQL查询是

INSERT INTO JobLocations(JobLocationId, JobId, DeviceId)
SELECT 
((SELECT MAX(JobLocationId) FROM JobLocations) + 
ROW_NUMBER() OVER (ORDER BY jh.GroupId)),
jh.GroupId, 
MAX(jh.SerialNumber)
FROM 
JobsHistory jh 
INNER JOIN 
dbo.Devices d ON jh.SerialNumber = d.DeviceId
GROUP BY 
jh.GroupId 
ORDER BY 
jh.GroupId ASC

但是这个代码的问题是它只输入jh.SerialNumber的最大值,而我想输入jh.SerialNumber中的所有值。然而,当我移除jh.SerialNumber周围的MAX()时,我收到以下错误:

JobsHistory列"。SerialNumber'在选择列表中无效,因为它既不包含在聚合函数中也不包含在GROUP BY子句中。

所以有一个简单的方法让我插入所有的SerialNumbers?我理解错误正在发生,因为它不知道"哪个"。SerialNumber选择,我已经在过去的帖子中查找了这个问题,但它没有解释如何插入所有条目,而只插入最大值。

编辑:例子:

JobsHistory:

GroupId | SerialNumber
--------+--------------
2732        335890264
2732        335890261
2732        335890437
2732        335890438

它只会插入335890438而不是全部4个

根据您的描述,似乎您只需要将SerialNumber添加到GROUP BY

INSERT INTO JobLocations(JobLocationId, JobId, DeviceId)
SELECT
(
(
SELECT MAX(JobLocationId)
FROM JobLocations
) + ROW_NUMBER() OVER (ORDER BY jh.GroupId)
)
, jh.GroupId
, jh.SerialNumber
FROM JobsHistory jh INNER JOIN dbo.Devices d ON jh.SerialNumber = d.DeviceId
GROUP BY jh.GroupId
, jh.SerialNumber
ORDER BY jh.GroupId ASC

但是假设你的问题已经完成了。查询输出的第一列(未命名)与GroupId之间是否需要关系?如果是的话,我可以修改我的答案。

最新更新