平成28年度 春期 午前Ⅱ 問9
データ操作
副問合せに関する問題
次の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の行ごとに、COL1の値が等しいTBL2の行が一つでもあるかを調べ、あればその行を残します。TBL2に同じ値があるかどうかを確かめている点は同じで、DISTINCTで重複も除かれるので、結果は一致します。INは値の一覧に含まれるかを調べ、EXISTSは条件に合う行があるかを調べる、と働きは違っても、相関の条件をCOL1の一致にすれば同じ意味になります。書き換えの問いでは、取り出す行が増えたり減ったりする条件が加わっていないかを確かめます。
ほかの選択肢はなぜ違うのか
- アSELECT DISTINCT TBL1…:UNIONは二つの検索結果を合わせるので、TBL2にしかない値も含まれます。両方に現れる値だけを取り出す元のSQL文と違い、結果の行が増えることがあります。
- ウSELECT DISTINCT TBL1…:COL1の一致に加えてCOL2の一致まで求めているので、COL1が等しくてもCOL2が異なる行は結果に残りません。元のSQL文にはない条件が加わり、取り出す値が減ることがあります。
- エSELECT DISTINCT TBL1…:左外結合では、TBL2に一致する行がなくてもTBL1の行はすべて残ります。結果はTBL1のCOL1の値すべてになり、TBL2に現れる値だけに絞り込む効果がありません。
出典:平成28年度 春期 データベーススペシャリスト試験 午前Ⅱ 問9
この解説に誤りを見つけたら教えてください。直して、直した記録を残します。誤りを報告する(メールが開きます)