MERGE文の復習

MERGE文の復習。Firebird2.1を使用しました。

サンプルデータの作成

CREATE TABLE employee (
  id INTEGER NOT NULL,
  name VARCHAR(1024) NOT NULL,
  PRIMARY KEY (id)
);
CREATE TABLE employee_temp (
  id INTEGER NOT NULL,
  name VARCHAR(1024) NOT NULL,
  PRIMARY KEY (id)
);

INSERT INTO employee (id, name) VALUES (1, 'Alice');
INSERT INTO employee (id, name) VALUES (2, 'Bob');
INSERT INTO employee (id, name) VALUES (3, 'Carol');

INSERT INTO employee_temp (id, name) VALUES (2, 'Becky');
INSERT INTO employee_temp (id, name) VALUES (4, 'Dave');

employeeテーブル

id name
 1 Alice
 2 Bob
 3 Carol

employee_tempテーブル

id name
 2 Becky
 4 Dave

employee_tempテーブルのデータをemployeeテーブルにマージする。

employeeテーブルとemployee_tempテーブルの両方にid=2のレコードがあるので、employeeテーブルのid=2のレコードは更新します。

id=4のレコードはemployee_tempテーブルにだけあるので、employeeテーブルに追加します。

MERGE INTO employee USING employee_temp ON (employee.id = employee_temp.id)
WHEN MATCHED THEN
  UPDATE SET employee.name = employee_temp.name
WHEN NOT MATCHED THEN
  INSERT (id, name) VALUES (employee_temp.id, employee_temp.name)

結果は、

id name
 1 Alice
 2 Becky
 3 Carol
 4 Dave

employeeテーブルに存在しないレコードだけ追加したい場合は、「WHEN MATCHED THEN」を使わず、「WHEN NOT MATCHED THEN」だけを使用します。

MERGE INTO employee USING employee_temp ON (employee.id = employee_temp.id)
WHEN NOT MATCHED THEN
  INSERT (id, name) VALUES (employee_temp.id, employee_temp.name)

結果は、

id name
 1 Alice
 2 Bob
 3 Carol
 4 Dave

コメントを残す

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

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください