【Oracle】MERGE文の使い方(更新と追加)

Oracle

今回は便利なMERGE文の使い方について説明します。MERGE文とは、すでに存在するデータは更新(UPDATE)存在しないデータは追加(INSERT)1つのSQLでまとめて実行できる便利な構文です。この記事を読むことによってMERGE文の使い方がわかるようになると思います!

データ準備

-- マージ先テーブルの作成
CREATE TABLE TARGET_USERS (
USER_ID NUMBER PRIMARY KEY,
USER_NAME VARCHAR2(50),
AGE NUMBER
);

-- マージ元テーブルの作成
CREATE TABLE SOURCE_USERS (
USER_ID NUMBER,
USER_NAME VARCHAR2(50),
AGE NUMBER
);

-- データの追加(マージ先テーブル)
INSERT INTO TARGET_USERS (USER_ID, USER_NAME, AGE) VALUES (1, '山田太郎', 30);
INSERT INTO TARGET_USERS (USER_ID, USER_NAME, AGE) VALUES (2, '佐藤花子', 50);

-- データの追加(マージ元テーブル)
INSERT INTO SOURCE_USERS (USER_ID, USER_NAME, AGE) VALUES (2, '佐藤花子', 26);
INSERT INTO SOURCE_USERS (USER_ID, USER_NAME, AGE) VALUES (3, '鈴木一郎', 40);

-- データ確認
SELECT
  *
FROM
  SOURCE_USERS
UNION ALL
SELECT
  *
FROM
  TARGET_USERS
ORDER BY
  USER_ID;
USER_IDUSER_NAMEAGE
1山田太郎30
2佐藤花子50
2佐藤花子25
3鈴木一郎40
マージ先テーブルとマージ元テーブルを確認(USER_ID2はUPDATE、USER_ID3はINSERT)

MERGE文の使い方(更新と追加)

UPDATE文とINSERT文を1つのSQで実行できるMERGE文は下記のように記述します。

MERGE INTO マージ先テーブル
USING マージ元テーブル 
ON (条 件) 
-- 条件に一致する
WHEN MATCHED THEN
 UPDATE
-- 条件に一致しない
WHEN NOT MATCHED THEN
 INSERT

MERGE文のポイント

  • MERGE INTO:更新・追加されるテーブル
  • USING:元データとなるテーブル
  • ON:同一データと判断する条件(結合条件)
  • WHEN MATCHED:一致した場合(UPDATE)
  • WHEN NOT MATCHED:一致しなかった場合(INSERT)

実際作ったテーブルでMERGE文を実行すると…

--マージ文
MERGE 
INTO TARGET_USERS T 
USING SOURCE_USERS S
 ON (T.USER_ID = S.USER_ID)
WHEN MATCHED THEN
UPDATE
SET
  T.USER_NAME = S.USER_NAME
  , T.AGE = S.AGE
WHEN NOT MATCHED THEN
INSERT
  (USER_ID, USER_NAME, AGE)
VALUES
  (S.USER_ID, S.USER_NAME, S.AGE);

-- データ確認
SELECT
  *
FROM
  TARGET_USERS;
USER_IDUSER_NAMEAGE
1山田太郎30
2佐藤花子25
3鈴木一郎40
マージ元テーブルのデータをマージ先テーブルに追加できたことを確認

注意点としては…

  • ON句で指定する条件は一意になるカラムを使う
  • UPDATE対象に主キーを含めないのが基本

になります。

まとめ

いかがでしたか?複雑に感じるかもしれませんが、少ないデータで動きを確認してみると理解できるかと思います。ぜひ、実際にテーブルを作成して動かしてみてください!

タイトルとURLをコピーしました