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つのテーブルがあるとします。
id | name | romaji |
---|---|---|
1 | 鈴木 | suzuki |
2 | 田中 | tanaka |
3 | 佐藤 | sato |
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します。
両方ともテーブル名はありません。
結果は、以下のとおりです。
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せずエラーになりません。
以下、テーブルがあるとします。
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されます。
id | name | romaji |
---|---|---|
1 | 鈴木 | suzuki |
2 | 田中 | tanaka |
3 | 佐藤 | sato |
6 | 竹田 | takeda |
関連の記事