2009-11-09 5 views

答えて

5

私はそれが同じ目的を果たすと思います。

not inはリテラル値をとりますが、not existsは結果を比較するクエリが必要です。

EDIT

:基準がインデックス化されている列を使用している場合、それは、外側のクエリ&と joinは、インデックスの使用につながることができますすることができますので、 not existsを使用するのに良いかもしれません。

EDIT2:thisも参照してください。

EDIT3:私は上記のことを取り戻しましょう。
thisリンクを参照してください。私はそれをすべての存在が速いことで、DB等のデータベース/インデックス

+0

ヌルの治療を忘れてはいけない返さない:http://stackoverflow.com/questions/1699424/what-the-differenceを間違っているoracle-query/1703712#1703712 –

+0

Tom Kyteのリンクは間違いなく問題の根本に到達します。 –

0

が存在することができ、性能の違いでこの&を変換する方法によって異なり、と思います。

最も重要な違いは、NULLの処理です。あなたのクエリはinとexistの両方で同じように動作するように見えるかもしれませんが、サブクエリがnullを返すとショックを受けるかもしれません。

nullsの存在が原因で失敗することがあります。

Joe Celkoの「smarties for SQL」を参照して、それぞれをいつ使用するかを理解してください。

0

要素の集合内の要素の現在の状態をテストしていないので、より簡単です。

グループ化(例:sum(x)= zまたはcount(*)> 3)を含むより複雑なクエリを処理することはできません。複数の条件(複数要素の一致など) 。

いくつかの状況では、より簡単ではないものが存在しません。私は一般的に、これが私が値のセットでキーフィールドの値をテストするところであることがわかります。経験則として

、私はそれがないよりも多くの状況をカバーとして存在しないことを好む。存在ていませんでは逆のためではなく、使用されているすべての状況のた​​めに使用することができます。

13

ませ、IN の違いとは、NOT NULL値が結果に含まがある場合が透明になるEXISTS。例えば

create table test_a (col1 varchar2(30 char)); 
create table test_b (col1 varchar2(30 char)); 

insert into test_a (col1) values ('a'); 
insert into test_a (col1) values ('b'); 
insert into test_a (col1) values ('c'); 
insert into test_a (col1) values ('d'); 
insert into test_a (col1) values ('e'); 

insert into test_b (col1) values ('a'); 
insert into test_b (col1) values ('b'); 
insert into test_b (col1) values ('c'); 
insert into test_b (col1) values (null); 

:彼らは重要な違いは、test_bnull値が含まれていることです。

select * from test_a where col1 not in (select col1 from test_b); 

行が

select * from test_a where 
    not exists 
     (select 1 from test_b where test_b.col1 = test_a.col1); 

戻り

col1 
==== 
d 
e 
+0

@ゴールド:私はあなたがこの答えを受け入れるべきだと思う、将来の訪問者が直接牛の目を取得するのに役立ちます。 – hagrawal

関連する問題