2

的背景

我有一个临时表,其中包含包括唯一 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 函数。有什么方法可以以不同的方式进行此操作吗?

4

1 回答 1

3

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

于 2013-07-29T18:48:00.687 回答