【SQL】MERGE文 INSERTとUPDATEを1行で実行する
該当データが存在する場合は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
;


今日はここまで。

未経験でもWEB業界に挑戦したい!【.pro】