2011-12-11 11 views
55

私はこのクエリを実行しようとしています:PostgreSQLのNOT IN 'とサブクエリ

SELECT mac, creation_date 
FROM logs 
WHERE logs_type_id=11 
AND mac NOT IN (select consols.mac from consols) 

をしかし、私は何の結果を得るません。私はそれをテストし、構文に何か問題があることを知っています。このようなクエリは完全に動作します。 macが存在しないことを確認するために行を追加しましたが、それでも結果は得られません。 NOT IN使用している場合

SELECT mac, creation_date 
FROM logs 
WHERE logs_type_id=11 
AND mac NOT IN (
    SELECT mac 
    FROM consols 
    WHERE mac IS NOT NULL -- add this 
) 
+4

'consols.mac'カラムが' NULL'か 'NOT NULL'ですか? –

答えて

96

あなたがた値のことを確認してください必要がありますされていない使用してNULLです。あなたはまた、LEFTを使用することができ

SELECT mac, creation_date 
FROM logs lo 
WHERE logs_type_id=11 
AND NOT EXISTS (
    SELECT * 
    FROM consols nx 
    WHERE nx.mac = lo.mac 
); 
+2

注: 'In(...)'は常にNULL(および重複)を取り除くので、サブクエリの 'WHERE mac IS NOT NULL'節は必要ありません。セットはNULLを含むことができないので、 – wildplasser

+3

@wildplasser私はそれについては知らない。 'IS NOT NULL'を追加するまで、私のために働いていませんでした。ネストされた 'SELECT'はいくつかの' NULLS'を返していて、 'IN(SELECT ...) 'をトリプルしていました。 – robins35

+1

私は 'IS NOT NULL'がなぜこれを動作させるのかについての説明を高く評価します。 – mbarkhau

25

、あなたも黙っヌル例を処理する、EXISTS、NOT考慮する必要があります。

+1

また、 'NOT EXISTS'と' ... NOT IN'を使用すると、大きなパフォーマンス低下に気づく – IcanDivideBy0

+1

@ IcanDivideBy0ほとんどの場合同じクエリプランが生成されます。あなたはそれをテストしましたか? – wildplasser

6

はJOINとNULL条件IS:

SELECT 
    mac, 
    creation_date 
FROM 
    logs 
    LEFT JOIN consols ON logs.mac = consols.mac 
WHERE 
    logs_type_id=11 
AND 
    consols.mac IS NULL; 

は "マック" 列のインデックスは、パフォーマンスが向上する可能性があります。

関連する問題