回答

收藏

每组更新单行

技术问答 技术问答 342 人阅读 | 0 人回复 | 2023-09-12

的背景
: z: J$ m3 ]/ H( L9 y6 t我有一个临时表,包括唯一的rowID,OrderNumber和guestCount信息。已经存在于表中。RowID和OrderNumber,而且我在运行一个新的查询,以为每个人都在运行一个新的查询orderNumber填写缺少的guestCount。然后,我想用此信息更新临时表。
1 t7 h) g$ k. e2 l+ X, w5 |! m( [例子
  q, u+ R5 V+ d! l) }% {4 z" A我目前所拥有的只有这样。RowID是唯一的,这意味着可以有多个是一样的OrderNumber的项目。
$ j- J; R4 @9 D9 U9 Y" b8 s  R                RowID | OrderNumber | guestCount                                               |   |   2         |   |     3                                                 |   |     4                                    |30003         | 0我的查询返回下表,每个查询返回下表orderNumber只返回总数的访客:6 L& T* u! ~8 `% {3 l+ }% e+ V& s+ w
                OrderNumber | guestCount   30001                                                                                                                       | 30002 30002    | 10   30003                                                                                                                                                          300000003330000003330000333300000330000033300003| 5最终表如下:
( d) V5 v" I% b- y' z                RowID | OrderNumber | guestCount                                               |   | 3    2                                                     |   | 10   3          |   |     4                                    | 30003       | 5我只对每个orderNumber更新一个(无关紧要)项目感兴趣,但我目前的逻辑导致了错误:
, _4 ?7 G8 K% p9 y/ i8 cUPDATE tempSET temp.guestCount = cc.guestCountFROM( SELECT OrderNumber,guestCount      FROM (SELECT OrderNumber,guestCount,RowID = MIN(RowID)      FROM #tempTable      GROUP BY RowID,OrderNumber,guestCount) t)tempINNER JOIN queryTable q ON temp.OrderNumber = q.OrderNumber我不确定逻辑是否是执行这个操作的有效方法,但我确实知道使用聚合函数和GROUP函数,所以更新中有错误。这个操作有什么不同的方法吗?
/ z( U% [0 N! w9 C; ^  O3 h                                                                $ K6 a% A# M' W; {
    解决方案:                                                                / d. U) v# V- D/ |! H& k
                                                                您可以通过row_number()在CTE用于定义要更新的行。这标志着更新组的第一行:
: a! c& F/ p8 ]; l! a5 Iwith 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-关系CTE具有row_number()可更新性。另外,你set语句使用cc查询中未定义的表别名。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则