ソースからターゲットに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
);
を持っている必要があり二度目 - ロジックが唯一のテーブルにマージを実行する前にあるデータではなく、テーブルの一部であるデータに適用されます(指定した基準に従って)最新の有効な行のみを返すビューを作成し、マージのソースとしてそのビューを使用することができます。 –
私はMERGEが設定された操作のどこかを読んでいます---これが何を意味していますか?レコード1がINSERTで、レコード2がレコード1と一致する場合、SQL Serverはrecord1がレコードに入っていることを確認し、レコード1のUPDATEを取得しますか?それとも、フルセットで動作しているため、マージしようとする次の時間にアップデートを入手するのですか?私が見つけた記事は、MERGEが行単位で操作できることを暗示しているようです。 – user991945
ソースからコピー先へのコピーのようにマージすると考えられますが、コピー先の行がすでにコピーされている場合はコピーされます。 – Diego