अपडेट करें:
मेरे ब्लॉग के इन लेखों में विधियों के बीच के अंतरों का अधिक विस्तार से वर्णन किया गया है:
NOT IN
बनामNOT EXISTS
बनामLEFT JOIN / IS NULL
:SQL Server
NOT IN
बनामNOT EXISTS
बनामLEFT JOIN / IS NULL
:PostgreSQL
NOT IN
बनामNOT EXISTS
बनामLEFT JOIN / IS NULL
:Oracle
NOT IN
बनामNOT EXISTS
बनामLEFT JOIN / IS NULL
:MySQL
ऐसी क्वेरी करने के तीन तरीके हैं:
-
LEFT JOIN / IS NULL
:SELECT * FROM common LEFT JOIN table1 t1 ON t1.common_id = common.common_id WHERE t1.common_id IS NULL
-
NOT EXISTS
:SELECT * FROM common WHERE NOT EXISTS ( SELECT NULL FROM table1 t1 WHERE t1.common_id = common.common_id )
-
NOT IN
:SELECT * FROM common WHERE common_id NOT IN ( SELECT common_id FROM table1 t1 )
जब table1.common_id
अशक्त नहीं है, ये सभी प्रश्न शब्दार्थ रूप से समान हैं।
जब यह अशक्त हो, NOT IN
अलग है, क्योंकि IN
(और, इसलिए, NOT IN
) रिटर्न NULL
जब कोई मान NULL
. वाली सूची में किसी भी चीज़ से मेल नहीं खाता है ।
यह भ्रमित करने वाला हो सकता है लेकिन यदि हम इसके लिए वैकल्पिक सिंटैक्स को याद करें तो यह अधिक स्पष्ट हो सकता है:
common_id = ANY
(
SELECT common_id
FROM table1 t1
)
इस स्थिति का परिणाम सूची के भीतर सभी तुलनाओं का एक बूलियन उत्पाद है। बेशक, एक ही NULL
मान NULL
उत्पन्न करता है परिणाम जो संपूर्ण परिणाम प्रस्तुत करता है NULL
भी।
हम निश्चित रूप से यह कभी नहीं कह सकते कि common_id
इस सूची से किसी भी चीज़ के बराबर नहीं है, क्योंकि कम से कम एक मान NULL
. है ।
मान लीजिए हमारे पास ये डेटा है:
common
--
1
3
table1
--
NULL
1
2
LEFT JOIN / IS NULL
और NOT EXISTS
वापस आ जाएगा 3
, NOT IN
कुछ नहीं लौटाएगा (चूंकि यह हमेशा FALSE
. में से किसी एक का मूल्यांकन करेगा या NULL
)।
MySQL
. में , गैर-शून्य कॉलम के मामले में, LEFT JOIN / IS NULL
और NOT IN
NOT EXISTS
. की तुलना में थोड़े (कई प्रतिशत) अधिक कुशल हैं . यदि कॉलम अशक्त है, NOT EXISTS
सबसे कुशल है (फिर से, ज्यादा नहीं)।
Oracle
. में , सभी तीन प्रश्न समान योजनाएँ उत्पन्न करते हैं (एक ANTI JOIN
)।
SQL Server
में , NOT IN
/ NOT EXISTS
अधिक कुशल हैं, क्योंकि LEFT JOIN / IS NULL
एक ANTI JOIN
के लिए अनुकूलित नहीं किया जा सकता है इसके अनुकूलक द्वारा।
PostgreSQL
में , LEFT JOIN / IS NULL
और NOT EXISTS
NOT IN
. से अधिक कुशल हैं , साइन वे एक ANTI JOIN
. के लिए अनुकूलित हैं , जबकि NOT IN
hashed subplan
. का उपयोग करता है (या यहां तक कि एक सादा subplan
अगर सबक्वेरी हैश के लिए बहुत बड़ी है)