私はこのクエリを実行しようとしています:
SELECT mac, creation_date
FROM logs
WHERE logs_type_id=11
AND mac NOT IN (select consols.mac from consols)
しかし、結果は得られません。私はそれをテストしましたが、構文に何か問題があることを知っています。 MySQLでは、このようなクエリは完全に機能します。 mac
テーブルに存在しないconsols
が1つあることを確認するために行を追加しましたが、それでも結果が得られません。
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
)
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
);
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」列のインデックスを使用すると、パフォーマンスが向上する場合があります。