高難易度問題対策-相関副問合せ

データベーススペシャリストの高難易度問題対策-相関副問合せ編。
最近全体の難易度が上がっているので出る可能性は高いかもしれない。

平成30年度 春期 午前II 問5


“社員”表に対して、SQL文を実行して得られる結果はどれか。ここで、実践の下線は主キーを表し、表中の‘NULL’は値が存在しないことを表す。

社員コード 上司 社員名
S001 NULL A
S002 S001 B
S003 S001 C
S004 S003 D
S005 NULL E
S006 S005 F
S007 S006 D

[SQL文]
SELECT 社員コード FROM 社員 X
WHERE NOT EXISTS
(SELECT * FROM 社員 Y WHERE X.社員コード=Y.上司)





回答 以下反転






解説


相関副問合せはイメージとしてはforループのような処理になる。

同じテーブル名にエイリアスをつけている場合以下のように分けるとイメージしやすい。
社員名はSQL文にないので除外して(考慮しなくて)もいい。

データベーススペシャリスト 副問合せ解説

まずX表の1レコードだけを考えてみる。
社員コードS001は上司に存在するので対象になる。

データベーススペシャリスト 副問合せ解説

これをレコード分繰り返す。

データベーススペシャリスト 副問合せ解説

最後にNOT EXISTになっているので反転して社員コードのみ取り出す。

データベーススペシャリスト 副問合せ解説

結果はS002,S004,S007 となり、これは上司でない社員の社員コードを抽出するSQLになる。

ちなみにXとYが完全に逆だった場合、上司がいない社員を取り出すといったSQLになる(イ:S001, S005)