助け合いフォーラム

Oracle DB

Oracle Master Silver SQL 2019(1Z0-071)
問題ID : 26635
問題を開く
EMPLOYEES表の構造を確認して下さい。



EMPLOYEE_IDが「1008」の従業員と上司が同じである従業員の名前と、上司のEMPLOYEE_IDを出力します。
どの問合せを使用しますか(2つ選択して下さい)。

正解

SELECT m.employee_name, e.manager_id FROM employees e
RIGHT OUTER JOIN employees m on (e.manager_id = m.manager_id)
WHERE e.employee_id = 1008;

SELECT employee_name, manager_id FROM employees
WHERE manager_id = (SELECT manager_id FROM employees WHERE employee_id = 1008);

解説

EMPLOYEE_IDが「1008」の従業員と上司が同じである従業員、つまり「1008」の同僚を求める問題です。1つのSQL文で問合せるには、自己結合と副問合せを使用します。

まず、自己結合の方ですが、EMPLOYEE_IDが「1008」の従業員データのEMPLOYEES表 e と、同僚データのEMPLOYEES表 m があると見立てます。上司が同じであるという条件ですので、ON句には「e.manager_id = m.manager_id」という結合条件を指定します。
※自己結合の例は通常、従業員データのEMPLOYEES表 e と上司データのEMPLOYEES表 m を見立てることが多いため、結合条件を「e.manager_id = m.employee_id」と間違えないようご注意ください。
JOIN句については、上記の結合条件の表 e と m には片方の表にしかない行が存在しないため、LEFT OUTER JOINとRIGHT OUTER JOINのどちらの外部結合でも、また、内部結合のJOIN句でも結果は同じです。両表に共通の行だけ取り出します。

次に副問合せの方は、副問合せでEMPLOYEE_IDが「1008」の従業員のMANAGER_IDを取り出して、それと同じMANAGER_IDを持つ従業員を主問合せで取り出します。

以上より、
・SELECT m.employee_name, e.manager_id FROM employees e
 RIGHT OUTER JOIN employees m on (e.manager_id = m.manager_id)
 WHERE e.employee_id = 1008;
・SELECT employee_name, manager_id FROM employees
 WHERE manager_id = (SELECT manager_id FROM employees WHERE employee_id = 1008);
が正解となります。

正解のSQL文の実行結果は次のようになります。


SQLを表示
SELECT m.employee_name, e.manager_id FROM employees e
RIGHT OUTER JOIN employees m on (e.manager_id = m.manager_id)
WHERE e.employee_id = 1008;



SQLを表示
SELECT employee_name, manager_id FROM employees
WHERE manager_id = (SELECT manager_id FROM employees WHERE employee_id = 1008);


その他の選択肢については次のとおりです。

・SELECT e.employee_name, m.manager_id FROM employees e
 LEFT OUTER JOIN employees m on (e.manager_id = m.employee_id)
 WHERE e.employee_id = 1008;
結合条件が「e.manager_id = m.employee_id」で、EMPLOYEE_IDが「1008」の従業員とその上司という条件になるため、「1008」の従業員名とその上司に登録してあるMANAGER_IDが取り出されます。誤ったSQL文です。


・SELECT e.employee_name, e.manager_id FROM employees e
 LEFT OUTER JOIN employees m on (e.employee_id = m.employee_id)
 WHERE e.employee_id = 1008;
結合条件が「e.employee_id = m.employee_id」で、EMPLOYEE_IDが「1008」の従業員と同じEMPLOYEE_IDの従業員という条件になるため、「1008」の従業員名とその上司のMANAGER_IDが取り出されます。誤ったSQL文です。


・SELECT employee_name, manager_id FROM employees
 WHERE employee_id = (SELECT manager_id FROM employees WHERE employee_id = 1008);
副問合せでEMPLOYEE_IDが「1008」の従業員のMANAGER_IDを取り出して、それと同じEMPLOYEE_IDを持つ従業員を主問合せで問合せています。「1008」の従業員の上司名とその上司に登録してあるMANAGER_IDが取り出されます。誤ったSQL文です。
上に戻る

問題文の間違い

投稿日 2024/12/19

●問題文
EMPLOYEE_IDが「1008」の従業員と上司が同じである従業員の名前と、上司のEMPLOYEE_IDを出力します。
どの問合せを使用しますか(2つ選択して下さい)。

問題文が上記のようになっています。
下記が正しいのではないでしょうか。
EMPLOYEE_IDが「1008」の従業員と上司が同じである従業員の名前と、上司のMANAGER_IDを出力します。
どの問合せを使用しますか(2つ選択して下さい)。

2024/12/19 17:47

EMPLOYEES表のレコードはEMPLOYEES_IDをキーに、その従業員の名前や上司の情報が格納されているものだと思いますが、MANAGER_ID列自体は「その従業員の上司のEMPLOYEE_ID」を表していて、その従業員に上司がいなければ空です。

本設問の問題文では、

EMPLOYEE_IDが「1008」の従業員と上司が同じである従業員の名前と、上司のEMPLOYEE_IDを出力します。

となっていますが、ここで「上司のEMPLOYEE_ID」の代わりに「上司のMANAGER_ID」と言ってしまうと、「上司の上司のEMPLOYEE_ID」を出力したいということになります。

解説にある正解の実行結果を見ると、列名は MANAGER_ID になりますが、実際に表示されているのは「上司のEMPLOYEE_ID」です。

実務でこういう出力を求めるシチュエーションなら、列別名とかつけると見やすいかなとは思いますけど、ちょっと趣旨から外れますね。


コメント

この返信に対して
コメントを記入できます

この投稿に対して返信しませんか?