web-dev-qa-db-ja.com

PostgreSQL 'NOT IN'およびサブクエリ

私はこのクエリを実行しようとしています:

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

しかし、結果は得られません。私はそれをテストしましたが、構文に何か問題があることを知っています。 MySQLでは、このようなクエリは完全に機能します。 macテーブルに存在しないconsolsが1つあることを確認するために行を追加しましたが、それでも結果が得られません。

79
skowron-line

NOT INを使用する場合、値がNULLでないことを確認する必要があります。

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
)
141
Mark Byers

NOT INを使用する場合は、NULLケースをサイレントに処理するNOT EXISTSも考慮する必要があります。 PostgreSQL Wiki も参照してください

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

LEFT JOINおよびIS NULL条件を使用することもできます。

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

「mac」列のインデックスを使用すると、パフォーマンスが向上する場合があります。

6
Frank Heikens