Подтвердить что ты не робот

PostgreSQL "НЕ В" и подзапрос

Я пытаюсь выполнить этот запрос:

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

Но я не получаю никаких результатов. Я тестировал его, и я знаю, что с синтаксисом что-то не так. В MySQL такой запрос работает отлично. Я добавил строку, чтобы убедиться, что существует один mac, который не существует в таблице consols, но все же он не дает никаких результатов.

4b9b3361

Ответ 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
)

Ответ 2

При использовании 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
  );

Ответ 3

Вы также можете использовать условие 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" может повысить производительность.