Quería ejecutar una consulta simple para arrojar todas las filas de Table1
donde un valor de columna principal no está presente en una columna en otra tabla ( Table2
).
Intenté usar:
SELECT * FROM Table1 WHERE Table1.principal NOT IN Table2.principal
Esto, en cambio, arroja un error de sintaxis. La búsqueda en Google me llevó a foros donde la gente decía que MySQL no es compatible NOT IN
y que algo extremadamente complejo debe ser utilizado. ¿Es esto cierto? ¿O estoy cometiendo un error horrendo?
Respuestas:
Para usar IN, debe tener un conjunto, use esta sintaxis en su lugar:
fuente
table2.principal
puede serNULL
. En ese casoNOT IN
, siempre se devolveráFALSE
porqueNOT IN
se trata como<> ALL
, que compara todas las filas de la subconsulta comoTable1.principal <> table2.principal
, lo que falla cuando se compara conNULL
:Table1.principal <> NULL
no dará como resultadoTRUE
. Para solucionar:NOT IN (SELECT principal FROM table2 WHERE principal IS NOT NULL)
.La opción de subconsulta ya ha sido respondida, pero tenga en cuenta que en muchos casos a
LEFT JOIN
puede ser una forma más rápida de hacer esto:Si desea verificar varias tablas para asegurarse de que no esté presente en ninguna de las tablas (como en el comentario de SRKR), puede usar esto:
fuente
NOT IN
yLEFT JOIN
. +1 ambosNO ESTÁ EN CONTRA NO EXISTE en ÚNICO IZQUIERDO / ES NULO en MySQL
[...]
[...]
[...]
(énfasis agregado)
fuente
Desafortunadamente, parece ser un problema con el uso de MySql de la cláusula "NOT IN", la captura de pantalla a continuación muestra la opción de subconsulta que devuelve resultados incorrectos:
fuente
¡Cuidado,
NOT IN
no es un alias para<> ANY
, sino para<> ALL
!http://dev.mysql.com/doc/refman/5.0/en/any-in-some-subqueries.html
no puede ser reemplazado por
Debes usar
fuente