以下のINSERT文を実行したとき、mid_sal表に挿入される行数はどれですか。
SELECT employee_id, salary FROM employees;
EMPLOYEE_ID SALARY
------------ -------
201 2500
202 3000
203 5000
204 12000
INSERT FIRST
WHEN salary >= 5000 THEN INTO high_sal VALUES (employee_id, salary)
WHEN salary >= 3000 THEN INTO mid_sal VALUES (employee_id, salary)
ELSE INTO low_sal VALUES (employee_id, salary)
SELECT employee_id, salary FROM employees;A1行✓
B2行
C3行
D4行
正解:A解説
INSERT FIRSTは、副問合せの各行について上から順にWHEN句を評価し、最初に条件を満たしたWHEN句だけを実行します。
| EMPLOYEE_ID | SALARY | 最初に満たすWHEN句 | 挿入先 |
|---|---|---|---|
| 201 | 2500 | なし(ELSE) | low_sal |
| 202 | 3000 | salary >= 3000 | mid_sal |
| 203 | 5000 | salary >= 5000 | high_sal |
| 204 | 12000 | salary >= 5000 | high_sal |
203と204はsalary >= 3000も満たしますが、先にsalary >= 5000を満たしているため、mid_salには挿入されません。そのため、mid_salに挿入されるのは202の1行です。
INSERT FIRST
...
4行が作成されました。INSERT ALLとINSERT FIRSTの違い
| 構文 | WHEN句の扱い | mid_salの行数 |
|---|---|---|
| INSERT ALL | 条件を満たすすべてのWHEN句を実行する | 3行 |
| INSERT FIRST | 最初に条件を満たしたWHEN句だけを実行する | 1行 |
どちらの場合も、ELSE句はどのWHEN句も満たさなかった行に対して実行されます。