平成22年度 春期 午前Ⅱ 問10
データ操作
副問合せに関する問題
次の SQL 文と同じ検索結果が得られる SQL 文はどれか。
SELECT DISTINCT TBL1.COL1 FROM TBL1
WHERE COL1 IN (SELECT COL1 FROM TBL2)- ア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
答えと解説を見る
✓ これが正解イSELECT DISTINCT TBL1.COL1 FROM TBL1 WHERE EXISTS (SELECT * FROM TBL2 WHERE TBL1.COL1 = TBL2.COL1)
解説
IN の副問合せは、EXISTS を使った相関副問合せに書き換えられます。
元の SQL 文は、TBL1 の COL1 のうち、TBL2 の COL1 に同じ値があるものを重複なく取り出します。EXISTS を使った文では、TBL1 の各行について、TBL2 に TBL1.COL1 = TBL2.COL1 となる行が一つでもあるかを調べ、あればその行を残します。外側の行の値を内側の条件で参照する相関副問合せの形ですが、残る行の条件は IN を使った場合と同じで、DISTINCT で重複も除くので結果は一致します。IN と EXISTS の書換えでは、内側の条件が結合列の一致だけになっているか、余計な条件や行の追加がないかを確かめると判断できます。
ほかの選択肢はなぜ違うのか
- アSELECT DISTINCT TBL1…:UNION は二つの問合せ結果の和をとるので、TBL1 にしかない値や TBL2 にしかない値も結果に入ります。両方の表に共通する値だけを取り出す元の文とは、結果が一致しません。
- ウSELECT DISTINCT TBL1…:COL1 の一致に加えて COL2 の一致まで条件にしているので、COL1 が同じでも COL2 が違う行は除かれてしまいます。元の文より条件が厳しく、取り出される値が少なくなる場合があります。
- エSELECT DISTINCT TBL1…:左外結合は、TBL2 に一致する行がない TBL1 の行も残します。そのため TBL1 の COL1 がすべて結果に現れ、TBL2 に同じ値があるものだけに絞り込む元の文とは結果が異なります。
出典:平成22年度 春期 データベーススペシャリスト試験 午前Ⅱ 問10
この解説に誤りを見つけたら教えてください。直して、直した記録を残します。誤りを報告する(メールが開きます)