助け合いフォーラム

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」の従業員データの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文の実行結果は次のようになります。

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

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文です。
解説
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;
これがダメな理由の解説がよくわかりません。どなたかよろしこお願いします。
あきらめたらそこで試合終了ですよね?
これがダメな理由の解説がよくわかりません。どなたかよろしこお願いします。
「よくわかりません」だと何がわからないのかよくわかりません。
解説を読んでどう理解したのか、AI アシスタントに質問してみてどうだったのかなど、何か理解に向けて取り組んだことや自分なりの解釈はありませんか?あるのであればそれも提示したほうがより良い回答が得られるかと思います。
あきらめたらそこで試合終了ですよね?
前回もこのフレーズありましたが、どういった反応を求めてらっしゃるのでしょうか?
コメント
LEFT OUTER でも RIGHT OUTER でも結果は同じになるように思えたのです。
試験を受けたいと思っているので安西先生みたくあきらめたらそこで試合終了ですよと言って欲しいです。
コメント
この投稿に対して返信しませんか?
a arashi1977
2026/03/17 23:49
> LEFT OUTER でも RIGHT OUTER でも結果は同じになるように思えたのです。 なぜ「同じになる」と思われたのか、そこが知りたいです。 「LEFT / RIGHT OUTER JOIN」がどう違うのかは、問題ID: 26507 の参考などに記載があるようです(left right outer join で検索したらすぐ出ました)。この参考を読んでいるのかはわかりませんが、「同じになる」という考えに至った理由をこの参考の説明を踏まえてもう少し詳細にして欲しいです。 なお、前回もわかっていてあえて触れませんでしたが、質問に対する返信を求める姿勢としては不適切かと思いますので、必須でなければ(「よろしこ」という表現も含め)自重されたほうがよろしいかと思います。