単なるシナリオです。gordatron と私が何について話していたかを理解するのに役立つかもしれません。
次の状況: 製品情報の中央格納場所であるテーブル "Products" と、構造が "Products" テーブルとまったく同じように見えるがデータが異なる可能性があるテーブル "UpdatedProducts" があります。次のシナリオを考えてみてください。午前中に製品テーブルをエクセルにエクスポートします。一日中、Excel テーブルの製品を削除、追加、更新します。一日の終わりに、Excel データを "Products" テーブルに再インポートしたいとします。何が必要:
- 「UpdatedProducts」からすべてのレコードを削除します
- Excel から「UpdatedProducts」へのデータの挿入 (可能であれば一括挿入)
- 「製品」テーブルを更新します
次に、Merge-Statement は次のようになります。
MERGE Products AS TARGET
USING UpdatedProducts AS SOURCE
ON TARGET.ProductID = SOURCE.ProductID
WHEN MATCHED AND TARGET.ProductName <> SOURCE.ProductName OR TARGET.Rate <> SOURCE.Rate
THEN UPDATE SET TARGET.ProductName = SOURCE.ProductName,
TARGET.Rate = SOURCE.Rate
WHEN NOT MATCHED BY TARGET
THEN INSERT (ProductID, ProductName, Rate)
VALUES (SOURCE.ProductID, SOURCE.ProductName, SOURCE.Rate)
WHEN NOT MATCHED BY SOURCE
THEN DELETE
このステートメントの動作: WHEN MATCHED: 両方のテーブルにデータが存在し、ProductName または Rate が異なる場合、「Products」のデータを更新します。
WHEN NOT MATCHED BY TARGET: データはステージング テーブルに存在しますが、元のテーブルには存在しません。「製品」に追加します
ソースが一致しない場合: データは元のテーブルに存在しますが、ステージング テーブルには存在しません。「製品」から削除されます
この完璧な例についてhttp://www.mssqltips.com/sqlservertip/1704/using-merge-in-sql-server-to-insert-update-and-delete-at-the-same-time/に感謝します!