助け合いフォーラム
Oracle Master Silver SQL 2019(1Z0-071)
問題ID : 26933
問題を開く
以下のSQL文の説明として正しいものはどれですか(2つ選択して下さい)。
INSERT ALL
WHEN salary <= 200000 OR salary IS NULL THEN
INTO grade_E
WHEN salary > 200000 AND salary <= 400000 THEN
INTO grade_D
WHEN salary > 400000 AND salary <= 600000 THEN
INTO grade_C
WHEN salary > 600000 AND salary <= 800000 THEN
INTO grade_B
ELSE
INTO grade_A
SELECT employee_id, salary FROM employees;
INSERT ALL
WHEN salary <= 200000 OR salary IS NULL THEN
INTO grade_E
WHEN salary > 200000 AND salary <= 400000 THEN
INTO grade_D
WHEN salary > 400000 AND salary <= 600000 THEN
INTO grade_C
WHEN salary > 600000 AND salary <= 800000 THEN
INTO grade_B
ELSE
INTO grade_A
SELECT employee_id, salary FROM employees;
正解
副問合せのSELECT句で返される行が全てのWHEN句で評価され、条件に合致した全てのINTO句で挿入される
全てのWHEN句の条件に合致しない行は、ELSE句でGRADE_A表に挿入される
解説
設問のSQL文は、1つのSQL文で複数の表にデータを追加できるマルチテーブル・インサートです。WHEN句を使用して条件に合致する行を挿入します。
INSERT ALL(デフォルト)では、副問合せで返される行が全WHEN句の条件式で評価され、条件に合致したものがWHEN句に対応するINTO句で挿入されます。つまり、条件に合致した全ての表に挿入されます。
ELSE句ではWHEN句の条件に合致しない行が挿入されます。ELSE句を省略した場合は、WHEN句の条件に合致しない行は挿入されません。
以上より、
・副問合せのSELECT句で返される行が全てのWHEN句で評価され、条件に合致した全てのINTO句で挿入される
・全てのWHEN句の条件に合致しない行は、ELSE句でGRADE_A表に挿入される
が正解です。
以下は設問のSQL文の実行例です。
例)副問合せでEMPLOYEES表のEMPLOYEE_ID列(従業員番号)とSALARY列(給与)を参照し、WHEN句のそれぞれの条件に合致した給与等級の表(GRADE_A~GRADE_E表)に挿入する

その他の選択肢については以下のとおりです。
・副問合せのSELECT句で返される行が順番にWHEN句で評価され、最初に条件に合致したINTO句で挿入される
INSERT FIRSTの説明なので、誤りです。
・SALARY列がNULLの行はGRADE_A表に挿入される
1つ目のWHEN句の条件でGRADE_E表に挿入されるので、誤りです。
・SALARY列が1000000の行はGRADE_B表に挿入される
4つのWHEN句の条件に合致しない1000000はELSE句でGRADE_A表に挿入されます。よって誤りです。
・ELSE句は省略できない
ELSE句は省略できるので、誤りです。ELSE句を省略した場合は、WHEN句の条件に合致しない行は挿入されません。
INSERT ALL(デフォルト)では、副問合せで返される行が全WHEN句の条件式で評価され、条件に合致したものがWHEN句に対応するINTO句で挿入されます。つまり、条件に合致した全ての表に挿入されます。
ELSE句ではWHEN句の条件に合致しない行が挿入されます。ELSE句を省略した場合は、WHEN句の条件に合致しない行は挿入されません。
以上より、
・副問合せのSELECT句で返される行が全てのWHEN句で評価され、条件に合致した全てのINTO句で挿入される
・全てのWHEN句の条件に合致しない行は、ELSE句でGRADE_A表に挿入される
が正解です。
以下は設問のSQL文の実行例です。
例)副問合せでEMPLOYEES表のEMPLOYEE_ID列(従業員番号)とSALARY列(給与)を参照し、WHEN句のそれぞれの条件に合致した給与等級の表(GRADE_A~GRADE_E表)に挿入する

SQLを表示
INSERT ALL
WHEN salary <= 200000 OR salary IS NULL THEN
INTO grade_E
WHEN salary > 200000 AND salary <= 400000 THEN
INTO grade_D
WHEN salary > 400000 AND salary <= 600000 THEN
INTO grade_C
WHEN salary > 600000 AND salary <= 800000 THEN
INTO grade_B
ELSE
INTO grade_A
SELECT employee_id, salary FROM employees;
SELECT * FROM grade_E;
WHEN salary <= 200000 OR salary IS NULL THEN
INTO grade_E
WHEN salary > 200000 AND salary <= 400000 THEN
INTO grade_D
WHEN salary > 400000 AND salary <= 600000 THEN
INTO grade_C
WHEN salary > 600000 AND salary <= 800000 THEN
INTO grade_B
ELSE
INTO grade_A
SELECT employee_id, salary FROM employees;
SELECT * FROM grade_E;
その他の選択肢については以下のとおりです。
・副問合せのSELECT句で返される行が順番にWHEN句で評価され、最初に条件に合致したINTO句で挿入される
INSERT FIRSTの説明なので、誤りです。
・SALARY列がNULLの行はGRADE_A表に挿入される
1つ目のWHEN句の条件でGRADE_E表に挿入されるので、誤りです。
・SALARY列が1000000の行はGRADE_B表に挿入される
4つのWHEN句の条件に合致しない1000000はELSE句でGRADE_A表に挿入されます。よって誤りです。
・ELSE句は省略できない
ELSE句は省略できるので、誤りです。ELSE句を省略した場合は、WHEN句の条件に合致しない行は挿入されません。
参考
【マルチテーブル・インサート】
マルチテーブル・インサートは、1つのSQL文で複数の表にデータを追加できる機能です。
通常のINSERT文では1文につき1行ずつ挿入しますが、マルチテーブル・インサートでは副問合せで返される複数の行を1つ以上の表に挿入できます。無条件のマルチテーブル・インサートと、条件付きのマルチテーブル・インサートがあります。
・無条件のマルチテーブル・インサート
INSERT ALL
INTO 表名[(列名1 [, 列名2 ...])] VALUES (値1 [, 値2 ...])
INTO 表名[(列名1 [, 列名2 ...])] VALUES (値1 [, 値2 ...])
[INTO 表名[(列名1 [, 列名2 ...])] VALUES (値1 [, 値2 ...])]
SELECT 列名1 [, 列名2...] FROM 表名2 [WHERE 条件]);
例1)EXAM表に生徒番号と国語、算数、音楽のテスト点数を挿入する
副問合せにDUAL表を使用した場合は、それぞれのINTO句が実行されます。

例2)教科ごとの集計テーブルKOKUGO表、SANSU表、ONGAKU表にそれぞれ生徒番号と各教科の点数を挿入する
EXAM表への副問合せで返される各行に対して、各INTO句が1回実行されます。

・条件付きのマルチテーブル・インサート
WHEN句を使用して条件に合致する行を挿入します。1つのマルチテーブル・インサートには最大127個のWHEN句を指定できます。
INSERT ALL | FIRST
WHEN 条件1 THEN
INTO 表名1
WHEN 条件2 THEN
INTO 表名2
・・・
[ELSE]
[ INTO 表名n]
SELECT 列名1 [, 列名2...] FROM 表名 [WHERE 条件]);
INSERT ALL(デフォルト)では、副問合せで返される行が全WHEN句の条件式で評価され、条件に合致したものがWHEN句に対応するINTO句で挿入されます。つまり、条件に合致した全ての表に挿入されます。
INSERT FIRSTでは、副問合せで返される行が順番にWHEN句の条件式で評価され、最初に条件に合致したWHEN句に対応するINTO句で挿入されます。その後のWHEN句はスキップされます。つまり、最初に条件に合致した表に挿入されます。
ELSE句ではWHEN句の条件に合致しない行が挿入されます。ELSE句を省略した場合は、WHEN句の条件に合致しない行は挿入されません。
以下に、副問合せでEMPLOYEES表のEMPLOYEE_ID列(従業員番号)とSALARY列(給与)を参照し、WHEN句のそれぞれの条件に合致した給与等級の表(GRADE_A~GRADE_E表)に挿入する例を示します。
例)INSERT ALL
全てのWHEN句が評価され合致した全ての表に挿入されるので、各条件の給与の範囲が重複しないように指定します。

例)INSERT FIRST
最初に条件に合致した表に挿入されるので、各給与等級の下限値が高い順に条件を指定します。

マルチテーブル・インサートは、1つのSQL文で複数の表にデータを追加できる機能です。
通常のINSERT文では1文につき1行ずつ挿入しますが、マルチテーブル・インサートでは副問合せで返される複数の行を1つ以上の表に挿入できます。無条件のマルチテーブル・インサートと、条件付きのマルチテーブル・インサートがあります。
・無条件のマルチテーブル・インサート
INSERT ALL
INTO 表名[(列名1 [, 列名2 ...])] VALUES (値1 [, 値2 ...])
INTO 表名[(列名1 [, 列名2 ...])] VALUES (値1 [, 値2 ...])
[INTO 表名[(列名1 [, 列名2 ...])] VALUES (値1 [, 値2 ...])]
SELECT 列名1 [, 列名2...] FROM 表名2 [WHERE 条件]);
例1)EXAM表に生徒番号と国語、算数、音楽のテスト点数を挿入する
副問合せにDUAL表を使用した場合は、それぞれのINTO句が実行されます。

SQLを表示
INSERT ALL
INTO exam VALUES (1, 75, 60, 82)
INTO exam VALUES (2, 80, 81, 77)
INTO exam VALUES (3, 100, 100, 95)
INTO exam VALUES (4, 97, 80, 84)
INTO exam VALUES (5, 45, 78, 64)
INTO exam VALUES (6, 86, 91, 90)
INTO exam VALUES (7, 75, 60, 82)
INTO exam VALUES (8, 92, 100, 95)
INTO exam VALUES (9, 98, 95, 78)
INTO exam VALUES (10, 80, 75, 97)
SELECT * FROM dual;
SELECT * FROM exam;
INTO exam VALUES (1, 75, 60, 82)
INTO exam VALUES (2, 80, 81, 77)
INTO exam VALUES (3, 100, 100, 95)
INTO exam VALUES (4, 97, 80, 84)
INTO exam VALUES (5, 45, 78, 64)
INTO exam VALUES (6, 86, 91, 90)
INTO exam VALUES (7, 75, 60, 82)
INTO exam VALUES (8, 92, 100, 95)
INTO exam VALUES (9, 98, 95, 78)
INTO exam VALUES (10, 80, 75, 97)
SELECT * FROM dual;
SELECT * FROM exam;
例2)教科ごとの集計テーブルKOKUGO表、SANSU表、ONGAKU表にそれぞれ生徒番号と各教科の点数を挿入する
EXAM表への副問合せで返される各行に対して、各INTO句が1回実行されます。

SQLを表示
INSERT ALL
INTO kokugo VALUES (student_id, kokugo)
INTO sansu VALUES (student_id, sansu)
INTO ongaku VALUES (student_id, ongaku)
SELECT student_id, kokugo, sansu, ongaku FROM exam;
SELECT * FROM kokugo;
INTO kokugo VALUES (student_id, kokugo)
INTO sansu VALUES (student_id, sansu)
INTO ongaku VALUES (student_id, ongaku)
SELECT student_id, kokugo, sansu, ongaku FROM exam;
SELECT * FROM kokugo;
・条件付きのマルチテーブル・インサート
WHEN句を使用して条件に合致する行を挿入します。1つのマルチテーブル・インサートには最大127個のWHEN句を指定できます。
INSERT ALL | FIRST
WHEN 条件1 THEN
INTO 表名1
WHEN 条件2 THEN
INTO 表名2
・・・
[ELSE]
[ INTO 表名n]
SELECT 列名1 [, 列名2...] FROM 表名 [WHERE 条件]);
INSERT ALL(デフォルト)では、副問合せで返される行が全WHEN句の条件式で評価され、条件に合致したものがWHEN句に対応するINTO句で挿入されます。つまり、条件に合致した全ての表に挿入されます。
INSERT FIRSTでは、副問合せで返される行が順番にWHEN句の条件式で評価され、最初に条件に合致したWHEN句に対応するINTO句で挿入されます。その後のWHEN句はスキップされます。つまり、最初に条件に合致した表に挿入されます。
ELSE句ではWHEN句の条件に合致しない行が挿入されます。ELSE句を省略した場合は、WHEN句の条件に合致しない行は挿入されません。
以下に、副問合せでEMPLOYEES表のEMPLOYEE_ID列(従業員番号)とSALARY列(給与)を参照し、WHEN句のそれぞれの条件に合致した給与等級の表(GRADE_A~GRADE_E表)に挿入する例を示します。
例)INSERT ALL
全てのWHEN句が評価され合致した全ての表に挿入されるので、各条件の給与の範囲が重複しないように指定します。

SQLを表示
INSERT ALL
WHEN salary <= 200000 OR salary IS NULL THEN
INTO grade_E
WHEN salary > 200000 AND salary <= 400000 THEN
INTO grade_D
WHEN salary > 400000 AND salary <= 600000 THEN
INTO grade_C
WHEN salary > 600000 AND salary <= 800000 THEN
INTO grade_B
ELSE
INTO grade_A
SELECT employee_id, salary FROM employees;
SELECT * FROM grade_E;
WHEN salary <= 200000 OR salary IS NULL THEN
INTO grade_E
WHEN salary > 200000 AND salary <= 400000 THEN
INTO grade_D
WHEN salary > 400000 AND salary <= 600000 THEN
INTO grade_C
WHEN salary > 600000 AND salary <= 800000 THEN
INTO grade_B
ELSE
INTO grade_A
SELECT employee_id, salary FROM employees;
SELECT * FROM grade_E;
例)INSERT FIRST
最初に条件に合致した表に挿入されるので、各給与等級の下限値が高い順に条件を指定します。

SQLを表示
INSERT FIRST
WHEN salary >= 800001 THEN
INTO grade_A
WHEN salary >= 600001 THEN
INTO grade_B
WHEN salary >= 400001 THEN
INTO grade_C
WHEN salary >= 200001 THEN
INTO grade_D
WHEN salary >= 0 OR salary IS NULL THEN
INTO grade_E
SELECT employee_id, salary FROM employees;
SELECT * FROM grade_E;
WHEN salary >= 800001 THEN
INTO grade_A
WHEN salary >= 600001 THEN
INTO grade_B
WHEN salary >= 400001 THEN
INTO grade_C
WHEN salary >= 200001 THEN
INTO grade_D
WHEN salary >= 0 OR salary IS NULL THEN
INTO grade_E
SELECT employee_id, salary FROM employees;
SELECT * FROM grade_E;
INSERT ALL文におけるELSE句について
h
hhhh_hhh
投稿日 2026/04/24
「ELSE句は省略できない」は誤回答と判定されていますが、
設問のSQLにおいてはELSE句がないと salary > 800000のデータがgrade_Aに挿入されず実行後の結果が変わってしまうため、ELSE句の省略はしてはいけないのではないでしょうか。
文法上は省略可能であることは承知しております。
2026/04/25 09:38
本設問はELSE句を省略すると実行後の結果が変わるかどうかを問いたいわけではないです。
あまり深く考えずに、設問のSQLでできること、できないこと、文法上問題ないかを判断するだけで良いでしょう。
コメント
この投稿に対して返信しませんか?