每组更新单行

时间:2013-07-29 18:43:32

标签: sql sql-server-2008

背景

我有一个包含唯一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只返回一个guest虚拟机总数:

    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功能。有没有办法以不同的方式进行此操作?

1 个答案:

答案 0 :(得分:3)

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

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关系。使用带有row_number()的CTE是可更新的。此外,您的set语句使用查询中未定义的表别名cc