मैं यह अनुमान लगाऊंगा कि 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'
);