SQL merge文のサンプル(更新と追加:Oracle)

SQLのmerge文で、更新と追加を行うサンプルです。

確認環境
・Oracle Express Edition 11g Release 2

目次

説明 merge文(更新と追加を行う)
サンプル merge文を使用したサンプル
  1つのテーブルでデータが存在しない時のみinsertするサンプル

merge文(更新と追加を行う)

merge into テーブルA
using テーブルB
on (条件)

-- 条件に一致する
when matched then
update文等

-- 条件に一致しない
when not matched then
insert文等

テーブルAとテーブルBの条件を判定します。
条件が一致した場合は、when matched thenが実行され、テーブルAをupdate等します。
条件が一致しない場合は、when not matched thenが実行され、テーブルAをinsert等します。

merge文を使用したサンプル

merge文を使用したサンプルです。

以下、2つのテーブルがあるとします。
1つめのsyainテーブルです。

syainテーブル
id name romaji
1 鈴木 suzuki
2 田中 tanaka
3 佐藤 sato

2つめのsyain_beforeテーブルです。

syain_beforeテーブル
id name romaji
2 田中 tanaka
4 高橋 takahashi

以下のSQLを実行します。

merge into syain a
using (
	select
     	id,
		name,
		romaji
		from syain_before
	)b
on (a.id = b.id)

-- 条件に一致する
when matched then
	update set
	  romaji = 'update'

-- 条件に一致しない
when not matched then
	insert 
		(id,
		 name,
		 romaji
		 )
	values
		(
		b.id,
		b.name,
		'insert'
		);

13行目のupdateは、1行目のsyainテーブルに対してupdateします。
18行目のinsertは、1行目のsyainテーブルに対してinsertします。
両方ともテーブル名はありません。
19~22行目は、通常のinsert文と同じくテーブルの全項目をvaluesで記述する場合は省略できます。

結果は、以下のとおりです。

syainテーブル
id name romaji
1 鈴木 suzuki
2 田中 update
3 佐藤 sato
4 高橋 insert

syainテーブルとsyain_beforeテーブルで一致した2行目はupdateされます。
syain_beforeテーブルのみにある4行目は、insertされました。
syainテーブルのみにある1,3行目は、何も更新されません。

1つのテーブルでデータが存在しない時のみinsertするサンプル

1つのテーブルでデータが存在しない時のみinsertするサンプルです。
データが存在したときは、insertせずエラーになりません。

以下、テーブルがあるとします。

syainテーブル
id name romaji
1 鈴木 suzuki
2 田中 tanaka
3 佐藤 sato

以下のSQLを実行します。

merge into syain a
using (
	select dummy from dual
	)b
on (a.id = 6) -- 6は、入力値を想定

-- 条件に一致しない
when not matched then
	insert 
		(id,
		 name,
		 romaji
		 )
	values
		(
		 6,         -- 入力値を想定
		'竹田',     -- 入力値を想定
		'takeda'    -- 入力値を想定
		);

3行目は、dual表で検索していますが他の箇所では使用していません。
5行目の6は入力値を想定しています。
このとき、syainテーブルにidが6のデータが存在しなければ8行目以下のinsert文が実行されます。
10~13行目は、通常のinsert文と同じくテーブルの全項目をvaluesで記述する場合は省略できます。

結果は、以下のとおりです。
上記merge文を初回実行した時のみ、id=6のデータがinsertされます。

syainテーブル
id name romaji
1 鈴木 suzuki
2 田中 tanaka
3 佐藤 sato
6 竹田 takeda

関連の記事

SQL INSERT文のサンプル
SQL UPDATE文とDELETE文のサンプル

△上に戻る