Sqlserver
 sql >> डेटाबेस >  >> RDS >> Sqlserver

एसक्यूएल का चयन करें जहां सबक्वायरी में कोई परिणाम नहीं देता है

अपडेट करें:

मेरे ब्लॉग के इन लेखों में विधियों के बीच के अंतरों का अधिक विस्तार से वर्णन किया गया है:

  • 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 अगर सबक्वेरी हैश के लिए बहुत बड़ी है)



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL सर्वर में "COALESCE के लिए कम से कम एक तर्क एक अभिव्यक्ति होना चाहिए जो NULL स्थिरांक नहीं है" ठीक करें

  2. समूह द्वारा छूटी हुई तिथियों को भरना

  3. विजुअल स्टूडियो 2017 इंस्टालर प्रोजेक्ट के साथ SQL सर्वर नामित उदाहरण

  4. सी # में SQL क्वेरी को सीधे कैसे निष्पादित करें?

  5. SQL सर्वर प्रबंधन स्टूडियो और Transact SQL में GO का क्या उपयोग है?