Budu předpokládat, že v sales_flat_order
existuje alespoň jeden záznam který splňuje podmínku status != 'holded'
a jehož customer_email
je NULL
.
(NOT) IN
je notoricky složité s NULL
s, zde je příklad.
Zvažte následující dotaz:
SELECT 1 WHERE 1 NOT IN (SELECT 2 UNION ALL SELECT 3)
Výsledkem je záznam s hodnotou 1
podle očekávání.
Pokud to však změníte na:
SELECT 1 WHERE 1 NOT IN (SELECT 2 UNION ALL SELECT NULL)
Potom dotaz vytvoří prázdnou sadu výsledků. Toto je dobře známý problém s (NOT) IN
. Z tohoto důvodu byste se měli obecně vyhnout této syntaxi a použít (NOT) EXISTS
namísto. Výše uvedený dotaz by mohl být přepsán jako:
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
)
Pro váš dotaz:
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'
);