2017-07-30 18 views
1


サブクエリの結果に基づいていくつかの結果を返したいと思います。
'ここで'重複しているか 'distinct distinct'を選択してください - パフォーマンス

select * 
from some_table 
where my_column in (select /* distinct? */ my_column from some_table_2) 
これは何か返します

-- subquery 
select /*distinct?*/ my_column from some_table_2; 

場合

:意味を持たないかもしれない

| MY_COLUMN 
1 | 25 
2 | 25 
3 | 54 
... 

この例が、それは私のポイントを提示します。

答えて

3

inのサブクエリにdistinctを置くと効果はありません。 inは、いわゆる「セミジョイン」を実行します。これは最初に一致する行で停止します。

Oracleはおそらくselect distinctを無視します。他のデータベースが実際にそれを実装するかもしれません。

あなたはパフォーマンスを気にしている場合、両方のこれらのバージョンを試してみてください。

select t.* 
from some_table t 
where my_column in (select my_column from some_table_2) 

select t.* 
from some_table t 
where exists (select 1 from some_table_2 t2 where t2.my_column = t.my_column); 

このバージョンはsome_table_2(my_column)にインデックスを利用することができます。

+1

私が間違っていない場合、これらの2つのステートメントはまったく同じです。 Oracleは最初のものを2番目のものに再書き込みします(11.2gでテスト済みhttp://sqlfiddle.com/#!4/4a9b0/2と2番目のOracle Live SQLで)計画ハッシュ値は同じ – LauDec

+0

@LauDec。 。 。私はそれが利用可能なインデックスに依存すると思います。同じ実行計画が必要ではない状況があり、Oracleにはかなりスマートなオプティマイザがあります。 –

関連する問題