2011-07-22 25 views
2

我正在更新某些列並每當更改一行時就遞增計數器。SQL Server在更新中增加計數器

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

有辦法解決這個問題(例如在select count上的另一個連接),但我想知道是否有辦法簡化它。

回答

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最終行已經滲透到只有那些也將在@至找到。如果不是,則可以爲最初的CTE添加更多條件。