2012-01-27 17 views
0

ソースからターゲットにMERGEを行い、存在しない行を挿入して行を更新したい場合があります。私がこれをすると、私は挿入だけを取得します...アップデートはありません。私はこの記事(http://stackoverflow.com/questions/5015623/merge-query-in-sql-server-2008)を読んでいますが、これは私にはちょっと混乱しますが、これを実現させる。誰かがなぜ重複したソースが必要なのか説明できますか?私はちょうどそれを取得していない、特にどのキーを使用する必要があります(複製元または通常のもの) - たぶん、重複SourceTableは必要ありません?ここテーブルが値なしのテーブルであるSQL Server 2008 MERGE

私(簡体字)SourceTable:

row userid placervalue placerDt 
    --- ------- ---------- ---------- 
    1  abc  a1   1/1/12 
    2  xyz  b1   1/1/12 
    3  abc  b2   1/20/12 
    etc. 

と同じである私のターゲットターゲット表が、現在はそれに行を持ちます。

row userid placerId 
    --- ------- ---------- 
    (nothing loaded yet) 

私がしたいのは、ターゲットにはない行を挿入し、その行を更新することです。

row userid placervalue placerDt 
    --- ------- ---------- ---------- 
    1  abc  a1   1/20/12 *** note change here (row 3 updates row 1) 
    2  xyz  b1   1/1/12 

私はこのコードを実行すると、私は唯一のインサート(も理由を知りたい)

MERGE TargetTable as t 
USING SourceTable as s 
    ON s.userid = t.usrid AND s.placervalue = t.placervalue 
WHEN MATCHED THEN 
    UPDATE 
     SET t.placerDt = s.placerDt 
WHEN NOT MATCHED THEN 
    INSERT (
     userid 
    , placerid 
    , placerDt 
    ) VALUES (
     s.userid 
    , s.placerid 
    , s.placerDt 
    ); 

答えて

1

あなたが先テーブルに行を持っていけない場合は、一致させるためには何もありませんを取得し、それが理由ですあなたは挿入物しか手に入れません。

クエリを実行しますが、ディエゴの答えに拡大アップデート

+1

を持っている必要があり二度目 - ロジックが唯一のテーブルにマージを実行する前にあるデータではなく、テーブルの一部であるデータに適用されます(指定した基準に従って)最新の有効な行のみを返すビューを作成し、マージのソースとしてそのビューを使用することができます。 –

+0

私はMERGEが設定された操作のどこかを読んでいます---これが何を意味していますか?レコード1がINSERTで、レコード2がレコード1と一致する場合、SQL Serverはrecord1がレコードに入っていることを確認し、レコード1のUPDATEを取得しますか?それとも、フルセットで動作しているため、マージしようとする次の時間にアップデートを入手するのですか?私が見つけた記事は、MERGEが行単位で操作できることを暗示しているようです。 – user991945

+0

ソースからコピー先へのコピーのようにマージすると考えられますが、コピー先の行がすでにコピーされている場合はコピーされます。 – Diego

関連する問題