平成23年度 特別 データベーススペシャリスト試験 午前Ⅱ 問5
テクノロジ/データベース“社員番号”と“氏名”を列としてもつ R 表と S 表に対して,差(R-S)を求める SQL 文はどれか。ここで,R 表と S 表の主キーは“社員番号”であり,“氏名”は“社員番号”に関数従属する。
出典:平成23年度 特別 データベーススペシャリスト試験 午前Ⅱ 問5
- ア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.社員番号)
正解:ウ
解説
差(R-S)は,R表に存在してS表に存在しない行を求める演算です。相関副問合せでNOT EXISTSを用い,R表の各行についてS表に同じ社員番号の行が存在しないことを確認するSELECT文が,この差演算を正しく表現します。
選択肢ごとの解説
- ア誤り。R表とS表を単純に結合し社員番号が一致しない行を取り出す方法では,行の組合せが多数生成されてしまい,正しい差集合にはなりません。
- イ誤り。UNIONはR表とS表を単純に合わせた和集合を求める演算であり,R表にしかない行だけを取り出す差演算にはなりません。
- ウ正しい。NOT EXISTSの相関副問合せにより,S表に同じ社員番号の行が存在しないR表の行だけを取り出すことができ,これは差(R-S)を表します。
- エ誤り。S表を基点にR表に社員番号が存在しない行を取り出しており,これは差(S-R)に相当し,求める差(R-S)とは逆になります。