首页 > 解决方案 > 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. 但是,当我删除MAX()周围时jh.SerialNumber,我收到以下错误:

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

那么有没有一种简单的方法可以让我插入所有的序列号?我知道错误正在发生,因为它不知道要选择“哪个”序列号,我已经在过去的帖子中查找过这个问题,它没有解释如何插入所有条目,而是只插入 MAX 值.

编辑:示例:

工作经历:

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

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

标签: sqlsql-server

解决方案


根据您的描述,您似乎只需要添加SerialNumberGROUP 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 之间的关系是否有要求?如果是这样,我可以修改我的答案。


推荐阅读