【解説】正解は選択肢【ウ】です。相関副問合せの条件「X.社員コード = Y.上司」を満たす行が存在しない(NOT EXISTS)社員Xを求めます。つまり、「誰かの上司になっていない社員(部下を持たない社員)」が選択されるため、結果はS002, S004, S007となります。
【詳細解説】■ 本問の核心・解法のポイント
本問の相関副問合せとNOT EXISTSの意味を正しく読み解くことがポイントです。
副問合せ:
SELECT * FROM 社員 Y WHERE X.社員コード = Y.上司
これは、「社員Xの社員コードが、他の社員Yの上司コードに一致する行が存在するか」を調べています。すなわち、「社員Xを上司とする部下Yが存在するか」を判定しています。
外側の条件が「WHERE NOT EXISTS (...)」となっているため、「自分を上司とする部下が1人も存在しない社員(部下を持たない社員)」を抽出します。
社員表の上司列に登場する社員コードを確認すると:
- S001(S002, S003の上司)
- S003(S004の上司)
- S005(S006の上司)
- S006(S007の上司)
したがって、上司列に現れる社員は S001, S003, S005, S006 です。これらは部下を持つ社員です。
一方、上司列に一度も現れない社員(部下を持たない社員)は、全社員(S001〜S007)から上記を除いた S002, S004, S007 となります。
・各選択肢の徹底解説:
・ア:S001, S003, S005, S006は「EXISTS」とした場合(誰かの上司である社員)の結果です。
・イ:S001, S005は上司がNULLの社員(最上位の上司)です。
・【選択肢ウ★】:部下を持たない社員であるS002, S004, S007が正しく抽出されています。
・エ:S003, S006は途中の階層に位置する社員の例であり、条件を満たしません。
よって正解はウです。