令和2年度 10月 午前Ⅱ 問8
データ操作
相関副問合せに関する問題
“社員”表に対して,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が残ります。
NOT EXISTSの副問合せは、外側の社員Xごとに、上司の列がXの社員コードと等しい行Yがあるかを調べます。そうした行が一つもないとき、つまりXが誰の上司にもなっていないときにXが残ります。表の上司の列に現れる値は、S001、S003、S005、S006の4つです。この4人は誰かの上司なので除かれ、残るのはS002、S004、S007です。外側の行を一つ固定して副問合せを評価する相関副問合せは、表を上から一行ずつ当てはめて確かめるのが確実です。
ほかの選択肢はなぜ違うのか
- ア社員コード:S001,S003,S005…:S001、S003、S005、S006は、上司の列に現れる社員、つまり誰かの上司になっている社員です。NOT EXISTSではなくEXISTSで条件を書いたときの結果にあたり、否定が逆になっています。
- イ社員コード:S001,S005:S001とS005は上司の列がNULLの社員、つまり自分に上司がいない最上位の社員です。SQL文が調べているのは自分が誰かの上司かどうかで、自分に上司がいるかどうかではありません。
- エ社員コード:S003,S006:S003とS006は、自分にも上司がいて、かつ誰かの上司でもある中間の社員です。この2人には部下がいるので副問合せで行が見つかり、NOT EXISTSの条件では除かれます。
出典:令和2年度 10月 データベーススペシャリスト試験 午前Ⅱ 問8
この解説に誤りを見つけたら教えてください。直して、直した記録を残します。誤りを報告する(メールが開きます)