SQL Server

MERGEでINSERTとUPDATEを1行で実行する

投稿日:2013/12/03 更新日:

MERGE文を使うと行の存在有無を気にせずに1行のSQLでOK

あるテーブルのデータを更新する際には「該当行があればUPDATE、
無ければINSERT」のようにデータが存在するかどうかでIF文を
書いてINSERTとUPDATEを切り分ける必要がある。

そんな面倒を解決するためにSQLServer 2008からは
MERGE文が利用できるようになりました。
これを利用すると、指定した条件に応じて
挿入(INSERT)、更新(UPDATE)、削除(DELETE)を
実行することが可能になります。

MERGEステートメントの構成

MERGEステートメントは、次の主要な句で構成されています。

MERGE句 挿入(INSERT)、更新(UPDATE)、削除(DELETE)の各操作の対象となるテーブルまたはビューを指定します。
USING句 対象と結合されるデータ ソースを指定します。
ON句 対象とソースが一致しているかどうか判断する結合条件を指定します。
WHEN句 WHEN MATCHED、WHEN NOT MATCHED BY TARGET、および WHEN NOT MATCHED BY SOURCE は、ON句の結果、および WHEN 句で指定した追加の検索条件の結果に基づいて実行する操作を指定します。
OUTPUT句 挿入(INSERT)、更新(UPDATE)、削除(DELETE)される対象の行ごとに 1 行を返します。

1つのテーブルに対するMERGE文

以下は1つのテーブルに対してのMERGE文で、
該当行があればUPDATE(更新)、なければINSERT(挿入)します。

UPDATE(更新)の例

以下はデータが存在した場合のUPDATE(更新)の例です。

上記の実行結果は

になります。

最初に検証用に挿入した「nameが二郎さん,ageが40」の
データが「nameが太郎さん,ageが30」に更新されています。
ON以下の「A.no=B.no」の条件が一致したので
UPDATE(更新)されています。

INSERT(挿入)の例

以下はデータが存在しない場合のINSERT(挿入)の例です。

上記の実行結果は

になります。

ON以下の「A.no=B.no」の条件が一致しなかったので
INSERT(挿入)されています。

2つのテーブルから結果をMERGEするMERGE文

以下は2つのテーブルに対してのMERGE文で、
test_tableAにtest_tableBの該当行があればUPDATE(更新)、
なければINSERT(挿入)します。

UPDATE(更新)の例

以下はデータが存在した場合のUPDATE(更新)の例です。

上記の実行結果は

になります。

test_tableAにもtest_tableBにも「no=10」の太郎さんが
存在したのでtest_tableBの内容でtest_tableAの太郎さんが
更新されています。

INSERT(挿入)の例

以下はデータが存在した場合のINSERT(挿入)の例です。

上記の実行結果は

になります。

test_tableAには「no=10」の太郎さんが
存在しなかったのでtest_tableBの内容でtest_tableAに
太郎さんが挿入されています。


このようにMERGE文を利用するればIF文で該当データの
存在確認をせずにUPDATE(更新)したりINSERT(挿入)したり
できます。
また、UPDATEの代わりにDELETEを利用すればデータの
削除も行えます。




-SQL Server
-, , ,

Copyright© ソフトウェア開発日記 , 2017 AllRights Reserved.