Jeg vil antage, at der er mindst én post i sales_flat_order
der opfylder betingelsen status != 'holded'
og hvis customer_email
er NULL
.
(NOT) IN
er notorisk vanskeligt med NULL
s, her er et eksempel.
Overvej følgende forespørgsel:
SELECT 1 WHERE 1 NOT IN (SELECT 2 UNION ALL SELECT 3)
Dette giver en post med værdien 1
, som forventet.
Men hvis du ændrer det til:
SELECT 1 WHERE 1 NOT IN (SELECT 2 UNION ALL SELECT NULL)
Derefter producerer forespørgslen et tomt resultatsæt. Dette er et velkendt problem med (NOT) IN
. Af denne grund bør du generelt undgå denne syntaks og bruge (NOT) EXISTS
i stedet. Ovenstående forespørgsel kunne omskrives som:
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
)
Til din forespørgsel:
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'
);