助け合いフォーラム
Oracle Master Silver SQL 2019(1Z0-071)
問題ID : 26900
問題を開く
部署3に属する従業員の月給(SALARY)と歩合給(COMMISSION)を、上司(MANAGER_ID)と同じ金額に更新します。
但し、MANAGER_ID列がNULLである部署3の上司についてはデータを更新しない事とします。
次のSQL文の実行結果について、正しい記述はどれですか。
UPDATE employees e
SET (e.salary, e.commission) = (SELECT m.salary, m.commission FROM employees m WHERE m.employee_id = e.manager_id)
WHERE e.department_id = 3 AND e.manager_id IS NOT NULL;
但し、MANAGER_ID列がNULLである部署3の上司についてはデータを更新しない事とします。
次のSQL文の実行結果について、正しい記述はどれですか。
UPDATE employees e
SET (e.salary, e.commission) = (SELECT m.salary, m.commission FROM employees m WHERE m.employee_id = e.manager_id)
WHERE e.department_id = 3 AND e.manager_id IS NOT NULL;
正解
正常に実行でき、目的の結果が得られる
解説
設問のSQL文では、主問合せの各行に対してその都度、副問合せが実行される「相関副問合せ」が使用されています。副問合せの中でそのFROM句に無い表を参照する場合(副問合せの外側にある表を参照する場合)に、相関副問合せとして処理されます。
EMPLOYEES表 e から取り出した各従業員のSALARY列とCOMMISSION列を、副問合せで取り出した、その従業員の上司と同じ金額に更新します。
副問合せは複数の列を返す「複数列副問合せ」を使用しています。
WHERE句には設問の条件である「e.department_id = 3」と、MANAGER_ID列がNULL値の上司のデータを除くために「e.manager_id IS NOT NULL」を指定しています。
正しいSQL文です。
以上より、
・正常に実行でき、目的の結果が得られる
が正解となります。
設問のSQL文の実行結果は次のようになります。

EMPLOYEES表 e から取り出した各従業員のSALARY列とCOMMISSION列を、副問合せで取り出した、その従業員の上司と同じ金額に更新します。
副問合せは複数の列を返す「複数列副問合せ」を使用しています。
WHERE句には設問の条件である「e.department_id = 3」と、MANAGER_ID列がNULL値の上司のデータを除くために「e.manager_id IS NOT NULL」を指定しています。
正しいSQL文です。
以上より、
・正常に実行でき、目的の結果が得られる
が正解となります。
設問のSQL文の実行結果は次のようになります。

SQLを表示
SELECT department_id, employee_name, salary, commission FROM employees WHERE department_id = 3;
UPDATE employees e
SET (e.salary, e.commission) = (SELECT m.salary, m.commission FROM employees m WHERE m.employee_id = e.manager_id)
WHERE e.department_id = 3 AND e.manager_id IS NOT NULL;
SELECT department_id, employee_name, salary, commission FROM employees WHERE department_id = 3;
UPDATE employees e
SET (e.salary, e.commission) = (SELECT m.salary, m.commission FROM employees m WHERE m.employee_id = e.manager_id)
WHERE e.department_id = 3 AND e.manager_id IS NOT NULL;
SELECT department_id, employee_name, salary, commission FROM employees WHERE department_id = 3;
参考
UPDATE文では、SET句やWHERE句に副問合せを指定したり、更新の対象となる表名の代わりに副問合せを指定することができます。
[SET句やWHERE句に副問合せを指定する場合]
UPDATE文のSET句で副問合せを使用して、表のデータを更新することができます。
UPDATE 表名 SET 列名 = (副問合せ)
[WHERE 条件]

UPDATE文に副問合せを指定する場合、SET句に指定した複数の列の値を、それぞれの副問合せで更新することもできますし、WHERE句に副問合せを使用することもできます。


なお、SET句で複数の副問合せを使用したUPDATE文は、複数列を返す副問合せを使用したUPDATE文に書き換える事ができます。

[表名の代わりに副問合せを指定する場合]
UPDATE文で表名の代わりに副問合せを指定すると、更新する列を制限することができます。
UPDATE (副問合せ) SET 列名 = 値 [, 列名 = 値 ...]
[WHERE 条件];

UPDATE句で表名の代わりに副問合せを指定すると、副問合せのSELECT句に指定した列の値しか更新することができません。SELECT句に指定されていない列を更新しようとするとエラーとなります。

また、WHERE句で条件を指定する場合も、副問合せのSELECT句に指定した列に関する条件しか指定できませんので注意しましょう。

[SET句やWHERE句に副問合せを指定する場合]
UPDATE文のSET句で副問合せを使用して、表のデータを更新することができます。
UPDATE 表名 SET 列名 = (副問合せ)
[WHERE 条件]

SQLを表示
UPDATE prod
SET category = (SELECT category
FROM prod
WHERE name = 'Jawz');
SELECT * FROM prod;
SET category = (SELECT category
FROM prod
WHERE name = 'Jawz');
SELECT * FROM prod;
UPDATE文に副問合せを指定する場合、SET句に指定した複数の列の値を、それぞれの副問合せで更新することもできますし、WHERE句に副問合せを使用することもできます。

SQLを表示
UPDATE prod
SET category = (SELECT category
FROM prod
WHERE name = 'Jawz'),
enddate = (SELECT SYSDATE + 15
FROM dual);
SELECT * FROM prod;
SET category = (SELECT category
FROM prod
WHERE name = 'Jawz'),
enddate = (SELECT SYSDATE + 15
FROM dual);
SELECT * FROM prod;

SQLを表示
UPDATE prod
SET category = (SELECT category
FROM prod
WHERE name = 'Jawz'),
enddate = (SELECT SYSDATE + 15
FROM dual)
WHERE prodid > (SELECT prodid
FROM oldprod
WHERE category = 60);
SELECT * FROM prod;
SET category = (SELECT category
FROM prod
WHERE name = 'Jawz'),
enddate = (SELECT SYSDATE + 15
FROM dual)
WHERE prodid > (SELECT prodid
FROM oldprod
WHERE category = 60);
SELECT * FROM prod;
なお、SET句で複数の副問合せを使用したUPDATE文は、複数列を返す副問合せを使用したUPDATE文に書き換える事ができます。

SQLを表示
UPDATE prod
SET (startdate, enddate)
= (SELECT SYSDATE - 15, SYSDATE + 15
FROM dual);
SELECT * FROM prod;
SET (startdate, enddate)
= (SELECT SYSDATE - 15, SYSDATE + 15
FROM dual);
SELECT * FROM prod;
[表名の代わりに副問合せを指定する場合]
UPDATE文で表名の代わりに副問合せを指定すると、更新する列を制限することができます。
UPDATE (副問合せ) SET 列名 = 値 [, 列名 = 値 ...]
[WHERE 条件];

SQLを表示
UPDATE (SELECT department_id, employee_id FROM employees)
SET department_id = 3;
SELECT department_id, employee_id
FROM employees;
SET department_id = 3;
SELECT department_id, employee_id
FROM employees;
UPDATE句で表名の代わりに副問合せを指定すると、副問合せのSELECT句に指定した列の値しか更新することができません。SELECT句に指定されていない列を更新しようとするとエラーとなります。

SQLを表示
UPDATE (SELECT department_id, employee_id FROM employees)
SET salary = 500000;
SET salary = 500000;
また、WHERE句で条件を指定する場合も、副問合せのSELECT句に指定した列に関する条件しか指定できませんので注意しましょう。

SQLを表示
UPDATE (SELECT department_id, employee_id
FROM employees)
SET department_id = 3
WHERE salary >= 500000;
FROM employees)
SET department_id = 3
WHERE salary >= 500000;
問題文
j
junext25
投稿日 2025/08/08
部署3に属する従業員の月給(SALARY)と歩合給(COMMISSION)を、上司(MANAGER_ID)と同じ金額に更新します。
但し、MANAGER_ID列がNULLである部署3の上司についてはデータを更新しない事とします。
とありますが、「MANAGER_ID列がNULLである部署3の上司について」ではなく「MANAGER_ID列がNULLである部署3の従業員について」の認識でいいでしょうか
r
rink_rew
2025/08/18 20:05
私も問題文を読んで一瞬「ん?」と思いましたが、
「MANAGER_ID列がNULLの人」 = 「上司という立場の人」
という意味だと認識していました。
なので、「MANAGER_ID列がNULLである部署3の上司について」という文言でも変だと感じなかったのですが、言われてみれば、junext25さんのおっしゃってるようにもとらえられるなとも思いました。
「MANAGER_ID列がNULLのデータを除外する」という目的で「e.manager_id IS NOT NULL」が使われているということは言えるかなと思います。
コメント
この投稿に対して返信しませんか?