こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

distinct をexistsに変換する

distinctをexistsに変換した方がパフォーマンスが良いようで、
例えば以下の例があるとします
----------------------------------
(前)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)
----------------------------------

もっと複雑なSQLの場合、EXISTSに変換できるのでしょうか?。複雑なSQLとは、
「複数のテーブルからカラムを取得」「テーブル結合が2つ以上」「外部結合」
などのSQLで、以下に例を示します。

(例)SELECT DISTINCT a.ID1,a.NAME1,b.ID2,b.NAME2,c.ID3,c.NAME3
   FROM TABLE1 a,TABLE2 b,TABLE3 c
   WHERE a.ID1 = b.ID1(+)
     AND a.ID1 = c.ID1(+)

投稿日時 - 2012-06-17 09:30:19

QNo.7538107

困ってます

質問者が選んだベストアンサー

効率的な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

がお勧めです。

投稿日時 - 2012-06-17 11:23:22

お礼

丁寧なご回答、どうもありがとうございました。
参考にいたします。
他の皆様もありがとうございました。

投稿日時 - 2012-07-10 22:56:55

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(4)

ANo.4

## 余計なお世話ですけど。。。

(前)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が単独でプライマリキー、またはユニークインデックスとして設定されている
という前提がないと同じ結果にはならないです。

投稿日時 - 2012-06-19 01:01:16

ANo.3

必ずしもできるとは限りません。少なくとも挙げられた例ではできません。
DISTINCTとEXISTSは別物です。

EXISTS句は(相関)副問合せなので、副問合せの外で列名を使用することができません。

投稿日時 - 2012-06-17 23:37:16

お礼

ご回答ありがとうございます。
必ずしもできる訳ではないということですね。
了解しました。

投稿日時 - 2012-06-19 00:19:03

ANo.1

DISTINCTは重複の排除をする機能なので、EXISTSに変換はできません。

投稿日時 - 2012-06-17 09:49:50

あなたにオススメの質問