背景
我有一个包含唯一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功能。有没有办法以不同的方式进行此操作?
答案 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
。