Tôi sẽ giả định rằng có ít nhất một bản ghi trong sales_flat_order
thỏa mãn điều kiện status != 'holded'
và customer_email
của ai là NULL
.
(NOT) IN
nổi tiếng là phức tạp với NULL
s, đây là một ví dụ.
Hãy xem xét truy vấn sau:
SELECT 1 WHERE 1 NOT IN (SELECT 2 UNION ALL SELECT 3)
Điều này tạo ra một bản ghi có giá trị 1
, như mong đợi.
Tuy nhiên, nếu bạn thay đổi điều đó thành:
SELECT 1 WHERE 1 NOT IN (SELECT 2 UNION ALL SELECT NULL)
Sau đó, truy vấn tạo ra một tập kết quả trống. Đây là sự cố nổi tiếng với (NOT) IN
. Vì lý do này, bạn nên tránh cú pháp này và sử dụng (NOT) EXISTS
thay vì. Truy vấn trên có thể được viết lại thành:
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
)
Đối với truy vấn của bạn:
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'
);