PostgreSQL 'NOT in' i subquery

Próbuję wykonać to zapytanie:

SELECT mac, creation_date 
FROM logs 
WHERE logs_type_id=11
AND mac NOT IN (select consols.mac from consols)
Ale nie mam żadnych rezultatów. Przetestowałem go i Wiem, że coś jest nie tak ze składnią. W MySQL takie zapytanie działa doskonale. Dodałem wiersz, aby mieć pewność, że istnieje jeden mac, który nie istnieje w tabeli consols, ale nadal nie daje żadnych wyników.
Author: Peter Mortensen, 2011-12-11

3 answers

Podczas używania NOT IN Należy upewnić się, że żadna z wartości nie jest 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
)
 170
Author: Mark Byers,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-12-11 09:39:07

Używając NOT IN, należy również wziąć pod uwagę NOT EXISTS, który obsługuje przypadki null po cichu. Zobacz też 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
  );
 29
Author: wildplasser,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-05-23 18:56:28

Możesz również użyć lewego JOIN i jest NULL warunek:

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

Indeks kolumn" mac " może poprawić wydajność.

 8
Author: Frank Heikens,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-12-11 12:27:03