Ответ 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
)
Я пытаюсь выполнить этот запрос:
SELECT mac, creation_date
FROM logs
WHERE logs_type_id=11
AND mac NOT IN (select consols.mac from consols)
Но я не получаю никаких результатов. Я тестировал его, и я знаю, что с синтаксисом что-то не так. В MySQL такой запрос работает отлично. Я добавил строку, чтобы убедиться, что существует один mac
, который не существует в таблице consols
, но все же он не дает никаких результатов.
При использовании 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, вы также должны учитывать 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" может повысить производительность.