的背景
我有一个临时表,其中包含包括唯一的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函数,因此更新中出现错误。有什么办法可以不同地进行此操作吗?
您可以通过row_number()在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的关系。使用CTE具有row_number()可更新性。此外,您的set语句使用cc查询中未定义的表别名。
temp
set
cc