Jag kommer att anta att det finns minst en post i sales_flat_order
som uppfyller villkoret status != 'holded'
och vars customer_email
är NULL
.
(NOT) IN
är notoriskt knepigt med NULL
s, här är ett exempel.
Tänk på följande fråga:
SELECT 1 WHERE 1 NOT IN (SELECT 2 UNION ALL SELECT 3)
Detta ger en post med värdet 1
, som förväntat.
Men om du ändrar det till:
SELECT 1 WHERE 1 NOT IN (SELECT 2 UNION ALL SELECT NULL)
Sedan producerar frågan en tom resultatuppsättning. Detta är ett välkänt problem med (NOT) IN
. Av denna anledning bör du i allmänhet undvika denna syntax och använda (NOT) EXISTS
istället. Ovanstående fråga kan skrivas om 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
)
För din fråga:
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'
);