2011-07-22 15 views
2

私は行を変更するときに、いくつかの列を更新してカウンタをインクリメントしています。SQL Server更新プログラムでカウンタをインクリメント

UPDATEステートメントは、結合(以下に簡略化コード)の結果である:

update @to 
    set 
     t.num += 1 
    from @to t 
    join @source s 
     on t.id = s.id 

私は何度も一列以上を更新する(彼らが必要として)、列は最後の値を保持するが、カウンタ1回だけインクリメントされます。したがって、(id = 1、id = 1)joinが返された場合、(id = 1、num = 2)ではなく、myテーブルが保持されます(id = 1、num = 1)。

これを回避する方法があります(たとえば、選択カウントで別の結合を行うなど)が、単純なままにする方法があるのだろうかと思います。

答えて

2

実際にカウントを取得せずにカウントを取得する方法はありません。うまくいけば、@sourceで終わる行はすでにも@toに記載されていますそれだけのものに絞り込まれ

;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に条件を追加できます。

関連する問題