平成30年度 春期 午前Ⅱ 問5
データ操作
相関副問合せに関する問題
“社員”表に対して,SQL文を実行して得られる結果はどれか。ここで,実線の下線は主キーを表し,表中の‘NULL’は値が存在しないことを表す。
社員
| 社員コード | 上司 | 社員名 |
|---|---|---|
| S001 | NULL | A |
| S002 | S001 | B |
| S003 | S001 | C |
| S004 | S003 | D |
| S005 | NULL | E |
| S006 | S005 | F |
| S007 | S006 | G |
〔SQL文〕
SELECT 社員コード FROM 社員 X
WHERE NOT EXISTS
(SELECT * FROM 社員 Y WHERE X.社員コード = Y.上司)
選択肢は原典では列名「社員コード」の結果表。
- ア社員コード:S001,S003,S005,S006
- イ社員コード:S001,S005
- ウ社員コード:S002,S004,S007
- エ社員コード:S003,S006
答えと解説を見る
✓ これが正解ウ社員コード:S002,S004,S007
解説
誰の上司にもなっていない社員S002・S004・S007が残ります。
見分ける軸は、相関副問合せが外側の行ごとに何を調べているかです。外側の社員Xの1行ごとに、Yの中にX.社員コードを上司に持つ行があるかを調べ、NOT EXISTSなので、そのような行が一つもないXだけを残します。つまり、誰の上司にもなっていない社員が結果です。上司の列に現れる社員コードを集めると、S001(S002とS003の上司)、S003(S004の上司)、S005(S006の上司)、S006(S007の上司)です。全7人からこの4人を除くと、S002・S004・S007の3人が残ります。NULLの上司は誰とも一致しないので、結果には影響しません。EXISTSの問は、副問合せを外側の1行に固定して読むと確実に評価できます。
ほかの選択肢はなぜ違うのか
- ア社員コード:S001,S003,S005…:S001・S003・S005・S006は、上司の列に社員コードが現れる、誰かの上司にあたる社員です。副問合せに該当する行がある社員を選ぶEXISTSの結果であり、NOT EXISTSとは逆になります。
- イ社員コード:S001,S005:S001とS005は、上司の列がNULLになっている社員です。条件は自分が誰の上司でもないかを調べており、自分に上司がいるかは問いません。この2人はどちらも部下を持つので除かれます。
- エ社員コード:S003,S006:S003とS006は、自分にも上司がいて、自分も誰かの上司になっている中間の立場の社員です。NOT EXISTSの条件では、誰かの上司である社員はすべて除かれるので、この2人も結果に残りません。
出典:平成30年度 春期 データベーススペシャリスト試験 午前Ⅱ 問5
この解説に誤りを見つけたら教えてください。直して、直した記録を残します。誤りを報告する(メールが開きます)