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

SQLのmerge文で、更新と追加を行うサンプルです。
OracleとSQL Serverで使用可能です。(確認環境:Oracle,SQLServer)

目次

説明 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つのテーブルがあるとします。

employeeテーブル
id name romaji
1 鈴木 suzuki
2 田中 tanaka
3 佐藤 sato
employee_beforeテーブル
id name romaji
2 田中 tanaka
4 高橋 takahashi

以下のSQLを実行します。

merge into employee a
using (
	select
     	id,
		name,
		romaji
		from employee_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行目のemployeeテーブルに対してupdateします。
18行目のinsertは、1行目のemployeeテーブルに対してinsertします。
両方ともテーブル名はありません。

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

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

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

 

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

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

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

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

以下のSQLを実行します。

merge into employee a
using (
	select dummy from dual -- Oracle
	-- select GETDATE() as dummy -- SQL Server
	)b
on (a.id = 6) -- 6は、入力値を想定

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

3行目は、dual表で検索していますが他の箇所では使用していません。
6行目の6は入力値を想定しています。
このとき、employeeテーブルにidが6のデータが存在しなければ8行目以下のinsert文が実行されます。

SQLServerの場合は4行目を以下のようにしても可能です。

	select top 1 id from employee

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

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

関連の記事

SQL INSERT文でテーブルの行を追加するサンプル
SQL UPDATE文でテーブルの行を更新するサンプル

△上に戻る