アプリ版:「スタンプのみでお礼する」機能のリリースについて

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(+)

A 回答 (4件)

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

    • good
    • 0

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

がお勧めです。
    • good
    • 2
この回答へのお礼

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

お礼日時:2012/07/10 22:56

必ずしもできるとは限りません。

少なくとも挙げられた例ではできません。
DISTINCTとEXISTSは別物です。

EXISTS句は(相関)副問合せなので、副問合せの外で列名を使用することができません。
    • good
    • 1
この回答へのお礼

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

お礼日時:2012/06/19 00:19

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

。。

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

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

関連するカテゴリからQ&Aを探す