平成28年度 春期 データベーススペシャリスト試験 午前Ⅱ 問9
テクノロジ/データベース次のSQL文と同じ検索結果が得られるSQL文はどれか。 SELECT DISTINCT TBL1.COL1 FROM TBL1 WHERE COL1 IN (SELECT COL1 FROM TBL2)
出典:平成28年度 春期 データベーススペシャリスト試験 午前Ⅱ 問9
- アSELECT DISTINCT TBL1.COL1 FROM TBL1 UNION SELECT TBL2.COL1 FROM TBL2
- イSELECT DISTINCT TBL1.COL1 FROM TBL1 WHERE EXISTS (SELECT * FROM TBL2 WHERE TBL1.COL1 = TBL2.COL1)
- ウSELECT DISTINCT TBL1.COL1 FROM TBL1, TBL2 WHERE TBL1.COL1 = TBL2.COL1 AND TBL1.COL2 = TBL2.COL2
- エSELECT DISTINCT TBL1.COL1 FROM TBL1 LEFT OUTER JOIN TBL2 ON TBL1.COL1 = TBL2.COL1
正解:イ
解説
元のSQL文は,TBL2にも存在するCOL1の値をもつTBL1の行から,COL1をDISTINCTで求めるものです。これは,TBL1の各行についてTBL2の中に同じCOL1の値をもつ行が存在するかどうかを判定する相関副問合せEXISTSを使って,WHERE EXISTS (SELECT * FROM TBL2 WHERE TBL1.COL1 = TBL2.COL1) と書き換えても同じ結果が得られます。
選択肢ごとの解説
- ア誤り。UNIONはTBL1のCOL1とTBL2のCOL1の和集合を求めるため,TBL2には存在するがTBL1には存在しない値も結果に含まれてしまい,「TBL1に存在し,かつTBL2にも存在する値」という元のSQL文の条件とは異なる結果になります。
- イ正しい。相関副問合せEXISTS (SELECT * FROM TBL2 WHERE TBL1.COL1 = TBL2.COL1) は,TBL1の各行についてTBL2内に同じCOL1の値をもつ行があるかどうかを判定するものであり,IN句を使った元のSQL文と同じ結果が得られます。
- ウ誤り。TBL1.COL2とTBL2.COL2という,元のSQL文には存在しない結合条件が追加されており,COL2の値が一致しない行は結果から除外されてしまうため,元のSQL文とは異なる結果になります。
- エ誤り。LEFT OUTER JOINではTBL2に一致する行がないTBL1の行もNULLを伴って結果に残ってしまい,かつTBL2に一致する行がない場合を除外するWHERE句(例えばTBL2.COL1 IS NOT NULLなど)もないため,元のSQL文の「TBL2にも存在する値だけ」という条件を満たしません。