以下のMERGE文で、bonuses表の各行はどうなりますか。
SELECT employee_id, bonus FROM bonuses;
EMPLOYEE_ID BONUS
------------ ------
101 100
102 200
109 50
SELECT employee_id, salary FROM employees WHERE department_id = 10;
EMPLOYEE_ID SALARY
------------ -------
101 3000
102 4000
103 5000
MERGE INTO bonuses b
USING (SELECT employee_id, salary FROM employees WHERE department_id = 10) e
ON (b.employee_id = e.employee_id)
WHEN MATCHED THEN
UPDATE SET b.bonus = e.salary * 0.1
WHEN NOT MATCHED THEN
INSERT (employee_id, bonus) VALUES (e.employee_id, e.salary * 0.05);A101:300、102:400、103:250、109:50✓
B101:300、102:400、103:250、109は削除される
C101:100、102:200、103:250、109:50
Dエラーになる
正解:A解説
MERGE文は、USING句の行(ソース)ごとにON句の条件を評価し、ターゲットの表に一致する行があればWHEN MATCHED、なければWHEN NOT MATCHEDの処理を行います。
| ソースの行 | bonusesとの一致 | 処理 | 結果のBONUS |
|---|---|---|---|
| 101 | あり | UPDATE(3000 × 0.1) | 300 |
| 102 | あり | UPDATE(4000 × 0.1) | 400 |
| 103 | なし | INSERT(5000 × 0.05) | 250 |
ソースに存在しない109の行は、MERGE文の対象にならないためそのまま残ります。
MERGE INTO bonuses b
...
3行がマージされました。
SELECT employee_id, bonus FROM bonuses;
EMPLOYEE_ID BONUS
------------ ------
101 300
102 400
109 50
103 250