अपडेट करें:
मेरे ब्लॉग के इन लेखों में विधियों के बीच अंतर के बारे में अधिक विस्तार से बताया गया है:
ऐसी क्वेरी करने के तीन तरीके हैं:
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 लौटाएगा (क्योंकि यह हमेशा या तो मूल्यांकन करेगा )।FALSENULL
में MySQL, गैर-व्यर्थ स्तम्भ पर मामले में, LEFT JOIN / IS NULLऔर NOT INकी तुलना में एक छोटा सा (कई प्रतिशत) अधिक कुशल हैं NOT EXISTS। यदि स्तंभ अशक्त है,NOT EXISTS तो सबसे अधिक कुशल है (फिर से, ज्यादा नहीं)।
Oracleतीनों प्रश्नों में , समान योजनाएँ (a 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अगर सबक्वेरी हैश लिए बहुत बड़ी है)