web-dev-qa-db-fra.com

PostgreSQL 'NOT IN' et sous-requête

J'essaie d'exécuter cette requête:

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

Mais je n'obtiens aucun résultat. Je l'ai testé et je sais qu'il y a quelque chose qui ne va pas dans la syntaxe. En MySQL, une telle requête fonctionne parfaitement. J'ai ajouté une ligne pour être sûr qu'il existe un mac qui n'existe pas dans la table consols, mais il ne donne toujours aucun résultat.

79
skowron-line

Lorsque vous utilisez NOT IN, vous devez vous assurer qu'aucune des valeurs n'est 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
)
141
Mark Byers

Lors de l'utilisation de NOT IN, vous devez également prendre en compte NOT EXISTS, qui gère les cas nuls de manière silencieuse. Voir aussi 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
  );
27
wildplasser

Vous pouvez également utiliser un LEFT JOIN et IS NULL condition:

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

Un index sur les colonnes "mac" pourrait améliorer les performances.

6
Frank Heikens