101 votes

PostgreSQL 'NOT IN' et sous-requête

J'essaye 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 un problème avec la syntaxe. Dans MySQL, une telle requête fonctionne parfaitement. J'ai ajouté une ligne pour être sûr qu'il y a un mac qui n'existe pas dans la consols , mais cela ne donne toujours aucun résultat.

198voto

Mark Byers Points 318575

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
)

31voto

wildplasser Points 17900

Lorsque vous utilisez NOT IN, vous devez également considérer NOT EXISTS, qui gère les cas nuls en silence. Voir aussi le Wiki PostgreSQL

 SELECT mac, creation_date 
FROM logs lo
WHERE logs_type_id=11
AND NOT EXISTS (
  SELECT *
  FROM consols nx
  WHERE nx.mac = lo.mac
  );

10voto

Frank Heikens Points 29270

Vous pouvez également utiliser une condition LEFT JOIN et 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;

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

2voto

splash Points 8499

Parce qu'aucune des réponses ne donne d'explication, la voici: NULLs vs. NOT IN()

J'aurais aimé donner un bilan, mais c'est trop compliqué à résumer (pour moi). ;-)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X