今回は便利な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_ID | USER_NAME | AGE |
| 1 | 山田太郎 | 30 |
| 2 | 佐藤花子 | 50 |
| 2 | 佐藤花子 | 25 |
| 3 | 鈴木一郎 | 40 |
MERGE文の使い方(更新と追加)
UPDATE文とINSERT文を1つのSQで実行できるMERGE文は下記のように記述します。
MERGE INTO マージ先テーブル
USING マージ元テーブル
ON (条 件)
-- 条件に一致する
WHEN MATCHED THEN
UPDATE
-- 条件に一致しない
WHEN NOT MATCHED THEN
INSERTMERGE文のポイント
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_ID | USER_NAME | AGE |
| 1 | 山田太郎 | 30 |
| 2 | 佐藤花子 | 25 |
| 3 | 鈴木一郎 | 40 |
注意点としては…
- ON句で指定する条件は一意になるカラムを使う
- UPDATE対象に主キーを含めないのが基本
になります。
まとめ
いかがでしたか?複雑に感じるかもしれませんが、少ないデータで動きを確認してみると理解できるかと思います。ぜひ、実際にテーブルを作成して動かしてみてください!
