Przyjmę założenie, że istnieje co najmniej jeden rekord w sales_flat_order
spełnia warunek status != 'holded'
i którego customer_email
jest NULL
.
(NOT) IN
jest notorycznie trudne z NULL
s, oto przykład.
Rozważ następujące zapytanie:
SELECT 1 WHERE 1 NOT IN (SELECT 2 UNION ALL SELECT 3)
Daje to rekord o wartości 1
zgodnie z oczekiwaniami.
Jeśli jednak zmienisz to na:
SELECT 1 WHERE 1 NOT IN (SELECT 2 UNION ALL SELECT NULL)
Następnie zapytanie generuje pusty zestaw wyników. Jest to dobrze znany problem z (NOT) IN
. Z tego powodu powinieneś generalnie unikać tej składni i używać (NOT) EXISTS
zamiast. Powyższe zapytanie można przepisać 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
)
Twoje zapytanie:
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'
);