小编典典

每组更新单行

sql

的背景

我有一个临时表,其中包含包括唯一的rowID,OrderNumber和guestCount的信息。该表中已经存在RowID和OrderNumber,并且我正在运行一个新查询以为每个orderNumber填写缺少的guestCount。然后,我想用此信息更新临时表。

例子

我目前所拥有的看起来像这样,只有RowID是唯一的,这意味着可以有多个具有相同OrderNumber的项目。

    RowID | OrderNumber | guestCount
    1     | 30001       | 0
    2     | 30002       | 0
    3     | 30002       | 0
    4     | 30003       | 0

我的查询返回下表,每个orderNumber仅返回一个总数的访客:

    OrderNumber | guestCount
    30001       | 3
    30002       | 10
    30003       | 5

最终表应如下所示:

    RowID | OrderNumber | guestCount
    1     | 30001       | 3
    2     | 30002       | 10
    3     | 30002       | 0
    4     | 30003       | 5

我只对每个orderNumber更新一个(无关紧要)条目感兴趣,但是我当前的逻辑导致错误:

UPDATE temp
SET temp.guestCount = cc.guestCount
FROM( SELECT OrderNumber, guestCount
      FROM (SELECT OrderNumber, guestCount, RowID = MIN(RowID)
      FROM #tempTable
      GROUP BY RowID, OrderNumber, guestCount) t)temp
INNER JOIN queryTable q ON temp.OrderNumber = q.OrderNumber

我不确定该逻辑是否是执行此操作的有效方法,但我确实知道由于使用聚合函数和GROUP函数,因此更新中出现错误。有什么办法可以不同地进行此操作吗?


阅读 232

收藏
2021-05-30

共1个答案

小编典典

您可以通过row_number()在CTE中使用来定义要更新的行。这标识了更新组中的第一行:

with toupdate as (
      select tt.*, row_number() over (partition by OrderNumber order by id) as seqnum
      from #tempTable tt
     )
UPDATE toupdate
    SET toupdate.guestCount = q.guestCount
    FROM toupdate
    INNER JOIN queryTable q
    ON temp.OrderNumber = q.OrderNumber
    where toupdate.seqnum = 1;

您查询的问题temp是基于聚合子查询。这样的子查询是不可更新的,因为它与原始查询的行没有1-1的关系。使用CTE具有row_number()可更新性。此外,您的set语句使用cc查询中未定义的表别名。

2021-05-30