![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?8acaa2e)
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(+)
No.2ベストアンサー
- 回答日時:
効率的な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
がお勧めです。
No.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が単独でプライマリキー、またはユニークインデックスとして設定されている
という前提がないと同じ結果にはならないです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Oracle sqlで質問です。 aテーブルとbテーブルがあり、下記のsqlで取得したidとnameに一致しないレ 1 2022/04/20 20:34
- Access(アクセス) アクセス 有効なフィールド名、または式として認識できませんのエラー 3 2022/08/19 11:53
- MySQL 書籍の内容はまともでしょうか? 1 2023/01/22 03:07
- Oracle 下記のsqlで取得されるレコード以外を取得する方法ありますでしょうか。 SELECT B.番号, B 2 2022/04/20 23:21
- MySQL 共通点はあります。何が違うのでしょうか? 1 2023/01/27 05:22
- Access(アクセス) アクセス where句を使用して複数条件抽出をするには 2 2022/08/29 13:24
- Oracle SQL update方法 2 2022/06/22 14:07
- PHP php my adminより取り出したデータ表示 2 2022/06/15 11:56
- Access(アクセス) 実行時エラー3131 FROM 句の構文エラーです について 7 2022/06/13 15:45
- Oracle sqlで質問です。 idを元にidに紐付くデータで住所コードがjpのみのデータ以外のidを取得したい 4 2023/03/20 17:41
このQ&Aを見た人はこんなQ&Aも見ています
-
「どうして捨てられないの?」前妻の物を捨てられない男性の心理って?
前妻の物を捨てられない理由に加え、捨てるための手段はあるのかを専門家に聞いてみた!
-
【SQL】他テーブルに含まれる値に合致する行を抽出
その他(データベース)
-
GROUP BYを行った後に結合したい。
Oracle
-
SQLで特定の項目の重複のみを排除した全項目を取得する方法
その他(プログラミング・Web制作)
-
-
4
副問合せの書き方について
SQL Server
-
5
MAX関数を使ってからLEFT JOINしたいのですが・・
PHP
-
6
SELECT 文の NULL列は?
PostgreSQL
-
7
重複削除の高速化
MySQL
-
8
キャッシュを使わずにSELECTを投げたい
Oracle
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ROWNUMでUPDATEをしたいのです...
-
テーブル名をカラムとして取得...
-
SQL、2つのテーブルで条件一致...
-
sqlplusで表示が変なので、出力...
-
PLSQLのNumber型の初期化
-
SQL*LoaderでCSVから指定した列...
-
update文で改行を入れる
-
OracleのSQLで同テーブルのカラ...
-
ワークテーブルって何?
-
SQLでSUMなどの関数でデータが...
-
SQL 不要な文字列を削除したい
-
SQL(oracle)でご助言いただきた...
-
DELETE文のWHERE条件にSUBSTRを...
-
distinct をexistsに変換する
-
UPDATE文
-
LONG型の先頭250バイトを Varch...
-
数値をNUMBER型にするかCHAR型...
-
oracleのエラー(ORA-00932)の...
-
マテリアライズド・ビューの変更
-
Oracle(オラクル)で、日付時刻...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
テーブル名をカラムとして取得...
-
SQL、2つのテーブルで条件一致...
-
update文で改行を入れる
-
ROWNUMでUPDATEをしたいのです...
-
SQL*LoaderでCSVから指定した列...
-
SQLでSUMなどの関数でデータが...
-
sqlplusで表示が変なので、出力...
-
カラム位置変更
-
件数とデータを同時に取得する...
-
SQL 複数テーブルのupdate
-
特定のカラムが更新されたとき...
-
OracleのSQLで同テーブルのカラ...
-
数値をNUMBER型にするかCHAR型...
-
UPDATE文
-
LONG型の先頭250バイトを Varch...
-
SQLで違うテーブルの値を比較し...
-
DELETE文とロックについて
-
PLSQLのNumber型の初期化
-
SQL(oracle)でご助言いただきた...
-
半角英数文字の抽出がしたい。
おすすめ情報