Estoy tratando de ejecutar esta consulta:
SELECT mac, creation_date
FROM logs
WHERE logs_type_id=11
AND mac NOT IN (select consols.mac from consols)
Pero no obtengo resultados. Lo probé y sé que hay algún problema con la sintaxis. En MySQL, esta consulta funciona perfectamente. Agregué una fila para asegurarme de que hay una macque no existe en la consolstabla, pero aún así no da ningún resultado.
postgresql
subquery
skowron-line
fuente
fuente

consols.maccolumnaNULLoNOT NULL?Respuestas:
Cuando use NOT IN, debe asegurarse de que ninguno de los valores sea 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 )fuente
WHERE mac IS NOT NULLcláusula en la subconsulta no es necesaria, ya queIn(...)siempre elimina NULL (y duplicados). Porque un conjunto no puede contener valores NULLIS NOT NULL. El anidadoSELECTestaba volviendo unos pocosNULLS, y eso fue tropezando elIN(SELECT...).IS NOT NULLesto funciona.NULLen unaNOT INcláusula no funciona porque una comparación conNULLno es ni verdadera ni falsa. sqlbadpractices.com/using-not-in-operator-with-null-valuesis not nullsi la subconsulta no produce valores coincidentes y al menos unnullvalor. De la sección 9.22 del manual de PostgreSQL actual (versión 10): "[…] si no hay valores iguales a la derecha y al menos una fila de la derecha da un resultado nulo, el resultado de la construcción NOT IN será nulo, no verdadero . "Cuando use NOT IN, también debe considerar NOT EXISTS, que maneja los casos nulos en silencio. Véase también Wiki de 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 );fuente
NOT EXISTSvs... NOT INTambién puede utilizar una condición LEFT JOIN y 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 índice en las columnas "mac" podría mejorar el rendimiento.
fuente