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