MERGE文の書き方です。
MERGE文はキーが存在すれば更新、無ければ挿入を行うという処理を
1文で記載するSQLです。
構文
MERGE文の構文です。
1 2 3 4 5 6 7 |
MERGE INTO <登録先テーブル名> USING <登録元テーブル名> ON <条件> WHEN MATCHED THEN <UPDATE句> WHEN NOT MATCHED THEN <INSERT句> |
サンプル
以下のテーブルを例にします。
code(PK) | name | cnt | price |
---|---|---|---|
100 | みかん | 150 | 80 |
101 | りんご | 50 | 120 |
102 | ぶどう | 30 | 300 |
code(PK) | name | cnt | price |
---|---|---|---|
100 | みかん | 250 | 90 |
103 | パイナップル | 20 | 500 |
例)tbl_fromテーブルの内容を、tbl_toテーブルへマージする
- テーブルからマージする例
- MERGE INTO tbl_to USING tbl_from ON (tbl_to.code = tbl_from.code) WHEN MATCHED THEN UPDATE SET tbl_to.name = tbl_from.name, tbl_to.cnt = tbl_from.cnt tbl_to.price = tbl_from.price WHEN NOT MATCHED THEN INSERT (code, name, cnt, price) VALUES (tbl_from.code, tbl_from.name, tbl_from.cnt, tbl_from.price) ;
tbl_toテーブルは以下の結果になります。
code | name | cnt | price |
---|---|---|---|
100 | みかん | 250 | 90 |
101 | りんご | 50 | 120 |
102 | ぶどう | 30 | 300 |
103 | パイナップル | 20 | 500 |
100:みかん行が更新され、103:パイナップル行が挿入されました。
例)指定した値を、tbl_toテーブルへマージする
- 値を指定してマージする例
- MERGE INTO tbl_to USING (SELECT '102' AS code, 'ぶどう' AS name, 35 AS cnt, 330 AS price FROM dual) val ON (tbl_to.code = val.code) WHEN MATCHED THEN UPDATE SET tbl_to.name = val.name, tbl_to.cnt = val.cnt tbl_to.price = val.price WHEN NOT MATCHED THEN INSERT (code, name, cnt, price) VALUES (val.code, val.name, val.cnt, val.price) ;
tbl_toテーブルは以下の結果になります。
code | name | cnt | price |
---|---|---|---|
100 | みかん | 150 | 80 |
101 | りんご | 50 | 120 |
102 | ぶどう | 35 | 330 |
102:ぶどう行が更新されました。
解説
- MERGE文のON句に指定した列は、UPDATEに含めることはできないのでご注意ください。
(ORA-38104エラーが発生します。)