本記事では、Oracleなどで、
条件に応じてテーブルの更新や追加をすることができる
MERGE文の使い方を紹介していく。
MERGE –テーブルの更新と追加を行う–
MERGE文を使うと、条件を満たす場合はレコードの値を更新する、そうでない場合はレコードを挿入するといった具合に、条件に応じてテーブルの更新や追加をすることが可能だ。
MERGE文の使い方
MERGE文の使い方は以下の様になっている。
merge into テーブルA
using テーブルB
on (条件)
-- 条件に一致する
when matched then
update文等
-- 条件に一致しない
when not matched then
insert文等
テーブルAを、テーブルBとの条件に一致するかしないかで、
UPDATEまたはINSERTを実行する。
条件が一致した場合は、when matched thenが実行され、テーブルAをupdate等する。
条件が一致しない場合は、when not matched thenが実行され、テーブルAをinsert等する。
MERGE文でテーブルを更新、追加するサンプル①
では実際に、MERGE文を使用して、テーブルを更新、追加するサンプルを紹介していく。
サンプルでは以下2つのテーブルを使用する。
people_main テーブル
id | name | kana |
1 | 鈴木 | suzuki |
2 | 田岡 | taoka |
3 | 佐山 | sayama |
people_sub テーブル
id | name | kana |
2 | 田岡 | taoka |
4 | 高橋 | takahashi |
以下のSQLを実行する。
merge into people a
using (
select
id,
name,
kana
from people_main
) b
on (a.id = b.id)
-- 条件に一致する
when matched then
update set
kana = '更新しました!'
-- 条件に一致しない
when not matched then
insert
(
id,
name,
kana
)
values
(
b.id,
b.name,
'追加しました!'
);
実行結果は以下の様になる。
peopleテーブル
id | name | kana |
1 | 鈴木 | suzuki |
2 | 田岡 | 更新しました! |
3 | 佐山 | sayama |
4 | 高橋 | 追加しました! |
条件(a.id = b.id)を満たすレコード(id = 2)は、when matched then が実行され、people_mainのkanaが「更新されました!」に更新されているのが分かるだろう。
一方、条件を見たなさいレコード(id = 4)は、when not matched then が実行され、レコードが新たに追加されているのが分かるだろう。
MERGE文でテーブルを更新、追加するサンプル②
次に、値を指定して登録・更新を行うサンプルを紹介する
値を指定してマージするには、USING句にSELECT文を指定する。
値を指定してマージするには以下の様な書式となる。
merge into テーブル1
using (select 値1, 値2 ・・・ from dual) 別名
on (条件)
-- 条件に一致する
when matched then
update文等
-- 条件に一致しない
when not matched then
insert文等
usingにテーブルではなく、SELECT文を使用している部分以外はサンプル①と特に違いはない。
サンプルとして、以下itemテーブルを使用する。
id | name | price | comment |
1 | メロン | 100 | 果肉たっぷり |
2 | いちご | 150 | null |
MERGE INTO item
USING (SELECT 3 id, 'ブルーベリー' name, 200 price, 'アントシアニン' comment FROM DUAL) new
ON item.id = new.id
WHEN MATCHED THEN
UPDATE SET
name = new.name, price = new.price, comment = new.comment
WHEN NOT MATCHED THEN
INSERT (id, name, price, comment)
VALUES (new.id, new.name, new.price, new.comment);
上記を実行後のitemテーブルが以下となる。
id | name | price | comment |
1 | メロン | 100 | 果肉たっぷり |
2 | いちご | 150 | null |
3 | ブルーベリー | 200 | アントシアニン |
指定したidがitemテーブルに存在しなかったため、登録されているのが分かるだろう。
関連記事
https://www.shift-the-oracle.com/sql/merge.html
https://docs.oracle.com/cd/E57425_01/121/SQLRF/statements_9017.htm
DUALというテーブルはOracleのSYSユーザのスキーマにあらかじめ用意されたダミーテーブルのこと。