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 mac
que no existe en la consols
tabla, pero aún así no da ningún resultado.
postgresql
subquery
skowron-line
fuente
fuente
consols.mac
columnaNULL
oNOT 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 NULL
clá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 anidadoSELECT
estaba volviendo unos pocosNULLS
, y eso fue tropezando elIN(SELECT...)
.IS NOT NULL
esto funciona.NULL
en unaNOT IN
cláusula no funciona porque una comparación conNULL
no es ni verdadera ni falsa. sqlbadpractices.com/using-not-in-operator-with-null-valuesis not null
si la subconsulta no produce valores coincidentes y al menos unnull
valor. 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 EXISTS
vs... NOT IN
Tambié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