Ik ga ervan uit dat er ten minste één record is in sales_flat_order
die voldoet aan de voorwaarde status != 'holded'
en wiens customer_email
is NULL
.
(NOT) IN
is notoir lastig met NULL
s, hier is een voorbeeld.
Beschouw de volgende vraag:
SELECT 1 WHERE 1 NOT IN (SELECT 2 UNION ALL SELECT 3)
Dit levert een record op met waarde 1
, zoals verwacht.
Als u dat echter verandert in:
SELECT 1 WHERE 1 NOT IN (SELECT 2 UNION ALL SELECT NULL)
Vervolgens produceert de query een lege resultatenset. Dit is een bekend probleem met (NOT) IN
. Om deze reden moet u deze syntaxis over het algemeen vermijden en (NOT) EXISTS
gebruiken in plaats van. De bovenstaande vraag kan worden herschreven als:
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
)
Voor uw vraag:
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'
);