ホーム > データベーススペシャリスト試験 > 2016年
データベーススペシャリスト試験 2016年 午前2 問09
次の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
解説
# 解説:与えられたSQL文と同じ検索結果を得るSQL文はどれか
---
## 問題のSQL文
```sql
SELECT DISTINCT TBL1.COL1 FROM TBL1
WHERE COL1 IN (SELECT COL1 FROM TBL2)
このSQL文が行っている処理を整理すると、
- TBL1テーブルのCOL1の値のうち、
- TBL2テーブルのCOL1の値に含まれているものを抽出し、
- 重複を除いて表示する
ということです。
つまり、「TBL1.COL1 の値が、TBL2.COL1 の中に存在するかどうか」を判定して結果を取得しています。
選択肢の分析
選択肢ア:
SELECT DISTINCT TBL1.COL1 FROM TBL1
UNION SELECT TBL2.COL1 FROM TBL2
- これはTBL1.COL1とTBL2.COL1の両方の値を合わせて重複なく列挙します。
- つまり、TBL1にもTBL2にも存在する値に限定せず、両方の全ての値が結果に含まれます。
- よって、問題文とは異なる結果となり誤り。
選択肢イ:
SELECT DISTINCT TBL1.COL1 FROM TBL1
WHERE EXISTS
(SELECT * FROM TBL2 WHERE TBL1.COL1 = TBL2.COL1)
-
WHERE句の EXISTSで、
-
「TBL2の中にTBL1と同じCOL1 を持つ行が存在する」かをチェックしている。
-
つまり、問題文の IN と同じ意味を持ちます。
-
重複を除く点も問題文に一致。
-
よって、問題文と同じ結果を返す正解のSQL文。
選択肢ウ:
SELECT DISTINCT TBL1.COL1 FROM TBL1, TBL2
WHERE TBL1.COL1 = TBL2.COL1
AND TBL1.COL2 = TBL2.COL2
- TBL1とTBL2の全組み合わせのうち、COL1だけでなくCOL2も一致する行を抽出。
- しかし問題文はCOL2については無条件なので、この条件は余分かつ厳しすぎる。
- 結果が一致しない。
選択肢エ:
SELECT DISTINCT TBL1.COL1 FROM TBL1 LEFT OUTER JOIN TBL2
ON TBL1.COL1 = TBL2.COL1
- LEFT OUTER JOINは、TBL1の行すべてを出力し、TBL2の一致する行を結合。
- そのため、TBL2に無いCOL1も出てきてしまう。
- 問題文のIN句の意味「TBL2に存在すること」とは異なる。
まとめ
参考情報: SQLのIN句とEXISTSの関係
COL1 IN (SELECT COL1 FROM TBL2)
はEXISTS (SELECT * FROM TBL2 WHERE TBL1.COL1 = TBL2.COL1)
と同じ意味を持ちます。- パフォーマンスはDBMSによるが、論理的には同等の結果になるため置き換えが可能。
以上より、正解は イ です。