Sql 每组更新一行

Sql 每组更新一行,sql,sql-server-2008,Sql,Sql Server 2008,背景 我有一个临时表,其中包含唯一的rowID、OrderNumber和guestCount等信息。此表中已存在RowID和OrderNumber,我正在运行一个新的查询,以填充每个OrderNumber缺少的guestCount。然后我想用这些信息更新临时表 示例 我目前拥有的是这样的东西,只有RowID是唯一的,这意味着可以有多个项目具有相同的订单号 RowID | OrderNumber | guestCount 1 | 30001 | 0 2

背景

我有一个临时表,其中包含唯一的rowID、OrderNumber和guestCount等信息。此表中已存在RowID和OrderNumber,我正在运行一个新的查询,以填充每个OrderNumber缺少的guestCount。然后我想用这些信息更新临时表

示例

我目前拥有的是这样的东西,只有RowID是唯一的,这意味着可以有多个项目具有相同的订单号

    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

我不确定这种逻辑是否是一种有效的方法,但我知道,由于我使用的是聚合函数以及组函数,所以在更新中会出现错误。是否有其他方法来执行此操作?

您可以在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与
行编号()一起使用是可更新的。此外,您的
set
语句使用了查询中未定义的表别名
cc

此方法实际上是更新原始“temp”表中的行,还是创建一个仅包含选定行的完全独立的表(CTE?)?如果在执行此操作后调用temp表上的select语句,它会返回更新后的结果,还是仅为CTE存储?供将来参考:是,它会返回更新后的结果。漂亮+1给你@泰勒比翰。您可以在SQL Server文档()中了解可更新视图。这也适用于CTE。