अपडेट करें:
मेरे ब्लॉग के इन लेखों में विधियों के बीच के अंतरों का अधिक विस्तार से वर्णन किया गया है:
NOT INबनामNOT EXISTSबनामLEFT JOIN / IS NULL:SQL ServerNOT INबनामNOT EXISTSबनामLEFT JOIN / IS NULL:PostgreSQLNOT INबनामNOT EXISTSबनामLEFT JOIN / IS NULL:OracleNOT 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 अगर सबक्वेरी हैश के लिए बहुत बड़ी है)