令和4年度 秋期 午前Ⅱ 問8
データ操作
NOT EXISTSに関する問題
“社員”表に対して,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 の3行です。
副問合せは、外側の社員 X ごとに、その社員コードを上司の列に持つ社員 Y がいるかを調べます。NOT EXISTS なので、そのような Y が一人もいない社員、つまり誰の上司にもなっていない社員が残ります。上司の列に現れる値は S001、S003、S005、S006 です。全社員の S001〜S007 からこれらを除くと、S002、S004、S007 の3行になります。上司の列の NULL は、どの社員コードとも一致しないので結果に影響しません。外側の行を一つ固定して、副問合せに一致する行があるかを確かめる、という相関副問合せの読み方を順に当てはめると、結果を確実に求められます。
ほかの選択肢はなぜ違うのか
- ア社員コード:S001,S003,S005…:S001、S003、S005、S006 は、上司の列に現れる社員、つまり誰かの上司になっている社員です。NOT を付けない EXISTS の結果にあたり、条件が反対になっています。
- イ社員コード:S001,S005:S001 と S005 は、上司の列が NULL の社員、つまり自分に上司がいない社員です。副問合せが比べているのは自分の社員コードが他の社員の上司の列にあるかどうかで、自分の上司の値ではありません。
- エ社員コード:S003,S006:S003 と S006 は、誰かの上司であり、かつ自分にも上司がいる社員です。NOT EXISTS は誰の上司にもなっていない社員を残す条件なので、上司になっているこの二人は結果から除かれます。
出典:令和4年度 秋期 データベーススペシャリスト試験 午前Ⅱ 問8
この解説に誤りを見つけたら教えてください。直して、直した記録を残します。誤りを報告する(メールが開きます)