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

ऐसे रिकॉर्ड खोजें जहां शामिल हों मौजूद नहीं है

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() (Ⓘ) दुगना है:

  1. प्रदर्शन

    आम तौर पर तेज होता है। पहला मैच मिलते ही यह सबक्वेरी को प्रोसेस करना बंद कर देता है। मैनुअल:

    <ब्लॉकक्वॉट>

    सबक्वेरी को आम तौर पर केवल यह निर्धारित करने के लिए काफी देर तक निष्पादित किया जाएगा कि क्या कम से कम एक पंक्ति लौटा दी गई है, पूरा होने तक नहीं।

    Ⓘ को क्वेरी प्लानर द्वारा भी अनुकूलित किया जा सकता है, लेकिन कुछ हद तक NULL . के बाद से हैंडलिंग इसे और अधिक जटिल बनाती है।

  2. सटीकता

    यदि सबक्वेरी एक्सप्रेशन में परिणामी मानों में से एक 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 . देखें:

  • उन पंक्तियों का चयन करें जो अन्य तालिका में मौजूद नहीं हैं


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. अजगर पाइप स्थापित psycopg2 त्रुटि स्थापित करें

  2. Php . में एकाधिक तालिकाओं के लिए क्वेरी लिखना

  3. Ansible PostgreSQL को प्यार करता है

  4. मैं पाइथन के माध्यम से PostgreSQL में कॉलम टिप्पणियां कैसे सम्मिलित कर सकता हूं?

  5. रेल:पीजी रत्न स्थापित करने में त्रुटि