Ще направя предположението, че има поне един запис в sales_flat_order
който отговаря на условието status != 'holded'
и чий customer_email
е NULL
.
(NOT) IN
е изключително труден с NULL
s, ето един пример.
Разгледайте следната заявка:
SELECT 1 WHERE 1 NOT IN (SELECT 2 UNION ALL SELECT 3)
Това дава запис със стойност 1
, както се очаква.
Ако обаче промените това на:
SELECT 1 WHERE 1 NOT IN (SELECT 2 UNION ALL SELECT NULL)
След това заявката създава празен набор от резултати. Това е добре известен проблем с (NOT) IN
. Поради тази причина обикновено трябва да избягвате този синтаксис и да използвате (NOT) EXISTS
вместо. Горната заявка може да бъде пренаписана като:
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
)
За вашето запитване:
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'
);