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 en a une mac
qui n'existe pas dans le consols
tableau, mais qui ne donne toujours aucun résultat.
postgresql
subquery
skowron-ligne
la source
la source
consols.mac
colonneNULL
ouNOT NULL
?Réponses:
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 )
la source
WHERE mac IS NOT NULL
clause dans la sous-requête n'est pas nécessaire, car elleIn(...)
supprime toujours les NULL (et les doublons). Parce qu'un ensemble ne peut pas contenir de valeurs nullesIS NOT NULL
. Le niché enSELECT
retournait quelques-unsNULLS
, et cela faisait trébucher leIN(SELECT...)
.IS NOT NULL
cela fonctionne.NULL
dans uneNOT IN
clause ne fonctionne pas car une comparaison avecNULL
n'est ni vraie ni fausse. sqlbadpractices.com/using-not-in-operator-with-null-valuesis not null
si la sous-requête ne produit aucune valeur correspondante et au moins unenull
valeur. De la section 9.22 du manuel PostgreSQL actuel (version 10): "[…] s'il n'y a pas de valeurs égales à droite et qu'au moins une ligne de droite donne null, le résultat de la construction NOT IN sera nul, pas vrai . "Lorsque vous utilisez NOT IN, vous devez également considérer NOT EXISTS, qui gère les cas nuls en silence. Voir aussi 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 );
la source
NOT EXISTS
vs... NOT IN
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" peut améliorer les performances.
la source