每当我更改一行时,我都会更新一些列并递增计数器。
更新语句是连接的结果(下面的简化代码):
update @to
set
t.num += 1
from @to t
join @source s
on t.id = s.id
当我多次更新一行时,列保留最后一个值(正如它们所应),但计数器只增加一次。因此,如果连接返回(id = 1,id = 1),我的表保持(id = 1,num = 1)而不是(id = 1,num = 2)。
有很多方法可以解决这个问题(例如,选择计数的另一个连接),但我想知道是否有办法让它变得简单。
答案 0 :(得分:2)
如果没有计算,就没有办法获得计数。这是一种方法(并且仍然只引用@source一次):
;WITH s AS
(
SELECT id, c = COUNT(*)
FROM @source
GROUP BY id
)
UPDATE t SET t.num += s.c
FROM @to AS t
INNER JOIN s
ON t.id = s.id;
希望最终在@source中的行已经过滤到只能在@to中找到的那些行。如果没有,您可以为初始CTE添加更多条件。