該当データが存在する場合はUPDATE、無ければINSERT
該当データが対象テーブルに存在するかどうかを調べて、 データが存在した場合とそうでない場合で、UPDATE文かINSERT文かを切り分けて行うことがありますが、
MERGEを使うとこれを1行で実現できます。
MERGEステートメント
MERGEステートメントの主な構成要素(句)は以下のようになります。
句 | 内容 |
---|---|
MERGE[INTO] | 挿入(INSERT)、更新(UPDATE)、削除(DELETE)の各操作の対象となるテーブルまたはビューを指定します。 |
USING | 対象と結合されるデータソースを指定します。 |
ON | 対象とソースが一致しているかどうか判断する結合条件を指定します。 |
WHEN MATCHED THEN | 操作対象のテーブルまたはビューに存在するレコードへの操作内容を指定します。 更新(UPDATE)はここに記述することになります。 |
WHEN NOT MATCHED THEN | 操作対象のテーブルまたはビューに存在しないレコードへの操作内容を指定します。 挿入(INSERT)操作はここに記述することになります。 「WHEN NOT MATCHED THEN」は「WHEN NOT MATCHED BY TARGET THEN」と記述することもできます。 |
WHEN NOT MATCHED BY SOURCE THEN | 比較対象のデータに存在しないレコードへの操作内容を指定します。 削除(DELETE)操作はここに記述することになります。 |
例文)
MERGE INTO 社員マスタ SM --登録先データ
USING (SELECT 社員コード ---登録元データ
,社員名
,部署
FROM 移行元社員マスタ ISM
WHERE 入社日 >= '2020/01/01'
)
ON (SM.社員コード = ISM.社員コード) --比較条件
WHEN MATCHED THEN --比較条件が一致する場合
UPDATE SET SM.社員名 = ISM.社員名
,SM.部署 = ISM.部署
WHERE SM.部署 <> ISM.部署 --更新条件
WHEN NOT MATCHED BY TARGET THEN --比較条件が一致しない場合①
-- 社員マスタに移行元社員マスタの会員が存在しない場合、登録
INSERT (社員コード
,社員名
,部署
)
VALUES (ISM.社員コード
,ISM.社員名
,ISM.部署
)
WHEN NOT MATCHED BY SOURCE THEN --比較条件が一致しない場合②
-- 社員マスタの会員が移行元社員マスタに存在しない場合、削除
DELETE
;
今日はここまで。