「MERGE」タグアーカイブ

SQL:MERGE文でINSERTとUPDATEを一度に行う効率的な方法

MERGE文とは?

SQLのMERGE文は、対象テーブルにデータが存在する場合はUPDATE、存在しない場合はINSERTを1回の処理でまとめて行える便利な構文です。
従来は「UPDATE → 該当しなければINSERT」といった2回の処理が必要でしたが、MERGEを使うことで1回のSQLで済むため、処理効率やパフォーマンスが向上します。

本記事ではOracleをベースに解説しつつ、他DBでの対応についても補足します。


MERGE文の基本構文(Oracleの場合)



実用例①:顧客マスタの更新 or 追加

ID=C001 が存在すれば更新
✅ 存在しなければ新規追加


処理の流れ(フロー図で理解)


応用例②:条件によってDELETEも行う(Oracle/SQL Server対応)

MERGE INTO ORDER_TABLE T
USING NEW_ORDER_DATA S
ON (T.ORDER_ID = S.ORDER_ID)
WHEN MATCHED AND S.STATUS = 'CANCEL' THEN
DELETE
WHEN MATCHED THEN
UPDATE SET T.AMOUNT = S.AMOUNT,
T.STATUS = S.STATUS
WHEN NOT MATCHED THEN
INSERT (ORDER_ID, AMOUNT, STATUS)
VALUES (S.ORDER_ID, S.AMOUNT, S.STATUS);

✅ ステータスがCANCELなら削除
✅ そうでなければ更新
✅ 該当なしならINSERT


MERGE文のメリット

項目従来方法MERGE文
SQL実行回数UPDATEとINSERTの2回1回
パフォーマンスやや低い高い
ロジックの明確さ分岐が必要条件分が整理されやすい
メンテナンス性低め高い

注意点

注意点内容
ロックの影響大量データの場合、テーブルロックが発生しやすい
複雑な条件WHEN句が増えると可読性が下がる
DB依存性MySQLは8.0.19以降、PostgreSQLはINSERT ... ON CONFLICTで代替

他DBでの補足

DBMERGE対応備考
Oracle対応本記事基準
SQL Server対応ほぼ同構文
MySQL8.0.19~対応REPLACE/INSERT ON DUPLICATEも可
PostgreSQL15~対応それ以前はINSERT ON CONFLICT

まとめ

✅ MERGE文はINSERTとUPDATEを1回の処理にまとめる強力なSQL構文
✅ DELETEも組み合わせれば高度なロジックも実現可能
✅ Oracle・SQL Serverでは標準的に使用される
✅ MySQL/PostgreSQLではバージョン確認が必要

「同じキーのデータを更新 or 追加したい」場面で積極的に使いましょう!