平成23年度 特別 午前Ⅱ 問5
データ操作
相関副問合せに関する問題
“社員番号”と“氏名”を列としてもつ R 表と S 表に対して,差(R−S)を求める SQL 文はどれか。ここで,R 表と S 表の主キーは“社員番号”であり,“氏名”は“社員番号”に関数従属する。
- アSELECT R.社員番号, S.氏名 FROM R, S WHERE R.社員番号 <> S.社員番号
- イSELECT 社員番号, 氏名 FROM R UNION SELECT 社員番号, 氏名 FROM S
- ウSELECT 社員番号, 氏名 FROM R WHERE NOT EXISTS (SELECT 社員番号 FROM S WHERE R.社員番号 = S.社員番号)
- エSELECT 社員番号, 氏名 FROM S WHERE S.社員番号 NOT IN (SELECT 社員番号 FROM R WHERE R.社員番号 = S.社員番号)
答えと解説を見る
✓ これが正解ウSELECT 社員番号, 氏名 FROM R WHERE NOT EXISTS (SELECT 社員番号 FROM S WHERE R.社員番号 = S.社員番号)
解説
S に同じ社員番号が無い R の行を NOT EXISTS で残します。
差 R−S は、R の行のうち S に含まれないものだけを集めた結果です。R と S の主キーは社員番号で、氏名は社員番号に関数従属するので、社員番号が S に無いかどうかを見れば、その行が S に無いかどうかを判定できます。そこで R の各行について、同じ社員番号をもつ S の行を探す相関副問合せを書き、NOT EXISTS でそれが一つも無い行だけを残します。これで R にあって S に無い社員の社員番号と氏名が得られます。差を SQL で書くときは、外側の表がどちらで、副問合せでどちらを探しているかを確かめると、向きの逆転を見抜けます。
ほかの選択肢はなぜ違うのか
- アSELECT R.社員番号, S.氏名 …:FROM に R と S を並べ、社員番号が異なる組合せをすべて取り出しています。R の社員が S にいても別の行と組めば残り、氏名も S 側から取るので、差の結果にはなりません。
- イSELECT 社員番号, 氏名 FROM…:UNION は R と S の行を合わせる和の演算です。S にある行を取り除くどころか加えてしまうので、差とは逆の向きの結果になります。
- エSELECT 社員番号, 氏名 FROM…:外側の表が S で、R に無い社員番号を探しているので、求めているのは S−R です。差は引く向きで結果が変わるので、R−S の答えにはなりません。
出典:平成23年度 特別 データベーススペシャリスト試験 午前Ⅱ 問5
この解説に誤りを見つけたら教えてください。直して、直した記録を残します。誤りを報告する(メールが開きます)