2017-10-18 26 views
1

Oracle DBを使用して、別のテーブルにないエントリを取得しようとしています。'not in'が動作していませんが、 'minus'はOracle DBで正常に動作しています

次のクエリでは、すべてのレコードを返さない:予想通り

select distinct FOO from TABLE_A where FOO not in (select distinct FOO from TABLE_B) 

しかし、次のように戻り、レコード:

(select distinct FOO from TABLE_A) minus (select distinct FOO from TABLE_B) 

なぜ最初のクエリでは動作しませんか?私がチェックした

もの:

  • 私は明確なキーワードが、運を削除しようとしました。
  • 私はクエリとサブクエリを個別に実行し、期待される結果を返します。
  • サブクエリを値リストに置き換えました - 期待どおりに動作します。
  • 私は列名のエイリアスを付けました。変更はありません。
  • 列のデータ型は同じです。
  • 問題を引き起こす可能性のあるテーブルが設定されている方法で何も見つけられませんでした。サブクエリで使用not exists
+2

'table_b'に' foo'が 'null'の行が含まれていますか? –

+0

はい、FOOがnullのTABLE_Bにはいくつかのレコードがあります。 –

+0

'not in'は過去10年ほどです。 'どこにも存在しない'は現在ではどこにあるのですか? – JohnHC

答えて

2

select distinct s.FOO 
from TABLE_A a 
where not exists (select 1 from table_b b where b.foo = a.foo); 

任意のb.fooが、その後、すべての行が除外されNULLです。この場合、not inはFALSEまたはNULLのいずれかを返します。条件はTRUEを返しません。

not existsは、期待されるセマンティクスを持っています。

in(まだ使用したい場合はnot in)を使用する場合は、サブクエリにselect distinctは不要です。

関連する問題