sql >> Base de Datos >  >> RDS >> Mysql

MySQL:¿NO DENTRO con la selección secundaria que no funciona como se esperaba?

Asumiré que hay al menos un registro en sales_flat_order que satisface la condición status != 'holded' y cuyo customer_email es NULL .

(NOT) IN es notoriamente complicado con NULL s, aquí hay un ejemplo.

Considere la siguiente consulta:

SELECT 1 WHERE 1 NOT IN (SELECT 2 UNION ALL SELECT 3)

Esto produce un registro con valor 1 , como se esperaba.

Sin embargo, si cambia eso a:

SELECT 1 WHERE 1 NOT IN (SELECT 2 UNION ALL SELECT NULL)

Entonces la consulta produce un conjunto de resultados vacío. Este es un problema bien conocido con (NOT) IN . Por esta razón, generalmente debe evitar esta sintaxis y usar (NOT) EXISTS en cambio. La consulta anterior podría reescribirse como:

SELECT 1 a
FROM (SELECT 1 a) t1
WHERE NOT EXISTS (
    SELECT 1
    FROM (SELECT 2 a UNION ALL SELECT NULL) t2
    WHERE t1.a = t2.a
)

Demostración en DB Fiddle

Para su consulta:

SELECT customer_email 
FROM sales_flat_order s
WHERE NOT EXISTS (
    SELECT 1
    FROM sales_flat_order s1
    WHERE s1.customer_email = s.customer_email AND s.status != 'holded'
);