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