- ベストアンサー
distinctをexistsに変換する方法とは?
- distinctをexistsに変換するとパフォーマンスが向上することがあります
- 複雑なSQLでもexistsに変換できる場合があります
- 複数のテーブルからのデータ取得やテーブル結合、外部結合でもexistsに変換できます
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
効率的なSELECT文を書くコツは、 SELECT句に必要のないテーブルはFROM句に書かない、 です。 最初の例は、TABLE1はSELECT句にありますが、TABLE2は無いですよね? この場合、TABLE1のみのSELECT句・FROM句を書いて、 WHERE句にTABLE2を書いたほうが良いです。 WHERE句に別のテーブルを「引っ掛けたい」場合は、EXISTSやINを利用してください。 一般的にはEXISTSの方が早いです。 二番目の例は。そもそも、TABLE1,2,3がSELECT句にあるので「変換」は出来ませんし そもそも、EXISTSとDISTINCTは変換可能な関係性にありません。 ところで、この外部結合は古い(確かOracle方言?)書き方です。 SELECT DISTINCT a.ID1,a.NAME1,b.ID2,b.NAME2,c.ID3,c.NAME3 FROM TABLE1 a LEFT OUTER JOIN TABLE2 b ON a.ID1 = b.ID1 LEFT OUTER JOIN TABLE3 c ON a.ID1 = c.ID1 がお勧めです。
その他の回答 (3)
- Siegrune
- ベストアンサー率35% (316/895)
## 余計なお世話ですけど。。。 (前)SELECT DISTINCT a.ID1, a.NAME1 FROM TABLE1 a, TABLE2 b WHERE a.ID1 = b.ID2 (後)SELECT a.ID1, a.NAME1 FROM TABLE1 a WHERE EXISTS ( SELECT 'X' FROM TABLE2 b WHERE a.ID1 = b.ID2) のほうも、一緒の結果になるとは限りませんが。。。 例)TABLE2はTABLE1のID1がすべてID2にあるとして。 a.ID1, a.NAME1 1 あ 2 い 2 い 3 う というデータがあれば、 (前) 1 あ 2 い 3 う (後) 1 あ 2 い 2 い 3 う となりますが。 ・・・ID1が単独でプライマリキー、またはユニークインデックスとして設定されている という前提がないと同じ結果にはならないです。
- entree
- ベストアンサー率55% (405/735)
必ずしもできるとは限りません。少なくとも挙げられた例ではできません。 DISTINCTとEXISTSは別物です。 EXISTS句は(相関)副問合せなので、副問合せの外で列名を使用することができません。
お礼
ご回答ありがとうございます。 必ずしもできる訳ではないということですね。 了解しました。
- 原沢 信道(@nharasawa)
- ベストアンサー率53% (90/168)
DISTINCTは重複の排除をする機能なので、EXISTSに変換はできません。
お礼
丁寧なご回答、どうもありがとうございました。 参考にいたします。 他の皆様もありがとうございました。