Saya akan membuat asumsi bahwa setidaknya ada satu record di sales_flat_order
yang memenuhi kondisi status != 'holded'
dan yang customer_email
adalah NULL
.
(NOT) IN
terkenal rumit dengan NULL
s, ini contohnya.
Pertimbangkan pertanyaan berikut:
SELECT 1 WHERE 1 NOT IN (SELECT 2 UNION ALL SELECT 3)
Ini menghasilkan catatan dengan nilai 1
, seperti yang diharapkan.
Namun jika Anda mengubahnya menjadi:
SELECT 1 WHERE 1 NOT IN (SELECT 2 UNION ALL SELECT NULL)
Kemudian kueri menghasilkan kumpulan hasil kosong. Ini adalah masalah yang terkenal dengan (NOT) IN
. Untuk alasan ini, Anda biasanya harus menghindari sintaks ini, dan menggunakan (NOT) EXISTS
alih-alih. Kueri di atas dapat ditulis ulang sebagai:
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
)
Untuk pertanyaan Anda:
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'
);