SQL Server在Update中增加计数器

时间:2011-07-22 03:18:10

标签: sql sql-server sql-server-2008 sql-update

每当我更改一行时,我都会更新一些列并递增计数器。

更新语句是连接的结果(下面的简化代码):

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)。

有很多方法可以解决这个问题(例如,选择计数的另一个连接),但我想知道是否有办法让它变得简单。

1 个答案:

答案 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添加更多条件。