(Oracle) MERGEでテーブルの更新と追加を行う

(Oracle) MERGEでテーブルの更新と追加を行う

 

本記事では、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文を使用している部分以外はサンプル①と特に違いはない。

DUALテーブル

DUALというテーブルはOracleのSYSユーザのスキーマにあらかじめ用意されたダミーテーブルのこと。

 

サンプルとして、以下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テーブルに存在しなかったため、登録されているのが分かるだろう。

 

関連記事

(Oracle) INTERSECTでテーブル同士の重複行を取得する
(Oracle) DISTINCT でselect結果から重複を無くす

 

https://www.shift-the-oracle.com/sql/merge.html

https://docs.oracle.com/cd/E57425_01/121/SQLRF/statements_9017.htm

 

記事が気に入った方はシェアをお願いします!

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です