PostgreSQL «НЕ В» и подзапрос - PullRequest
76 голосов
/ 11 декабря 2011

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

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

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

Ответы [ 3 ]

133 голосов
/ 11 декабря 2011

При использовании 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
)
27 голосов
/ 11 декабря 2011

При использовании 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
  );
6 голосов
/ 11 декабря 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...