EXISTS
का उपयोग करें अभिव्यक्ति:
WHERE NOT EXISTS (
SELECT FROM votes v -- SELECT list can be empty
WHERE v.some_id = base_table.some_id
AND v.user_id = ?
)
अंतर
... NOT EXISTS()
. के बीच (Ⓔ) और NOT IN()
(Ⓘ) दुगना है:
-
प्रदर्शन
आम तौर पर तेज होता है। पहला मैच मिलते ही यह सबक्वेरी को प्रोसेस करना बंद कर देता है। मैनुअल:
<ब्लॉकक्वॉट>सबक्वेरी को आम तौर पर केवल यह निर्धारित करने के लिए काफी देर तक निष्पादित किया जाएगा कि क्या कम से कम एक पंक्ति लौटा दी गई है, पूरा होने तक नहीं।
Ⓘ को क्वेरी प्लानर द्वारा भी अनुकूलित किया जा सकता है, लेकिन कुछ हद तक
NULL
. के बाद से हैंडलिंग इसे और अधिक जटिल बनाती है। -
सटीकता
यदि सबक्वेरी एक्सप्रेशन में परिणामी मानों में से एक
<ब्लॉकक्वॉट>NULL
है , Ⓘ का परिणामNULL
. है , जबकि सामान्य तर्कTRUE
. की अपेक्षा करेंगे - और ⒺTRUE
return लौटाएगा . मैनुअल:यदि सभी प्रति-पंक्ति परिणाम या तो असमान या शून्य हैं, कम से कम एक नल के साथ, तो
NOT IN
का परिणाम शून्य है।
अनिवार्य रूप से, (NOT) EXISTS
ज्यादातर मामलों में बेहतर विकल्प है।
उदाहरण
आपकी क्वेरी कुछ इस तरह दिख सकती है:
SELECT *
FROM questions q
WHERE NOT EXISTS (
SELECT FROM votes v
WHERE v.question_id = q.id
AND v.user_id = ?
);
नहीं करें votes
में शामिल हों आधार क्वेरी में। इससे प्रयास शून्य हो जाएगा।
इसके अलावा NOT EXISTS
और NOT IN
LEFT JOIN / IS NULL
. के साथ अतिरिक्त सिंटैक्स विकल्प हैं और EXCEPT
. देखें:
- उन पंक्तियों का चयन करें जो अन्य तालिका में मौजूद नहीं हैं