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.
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
)
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
);
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.