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

PostgreSQL जहां सभी सरणी में

मान लें कि जॉइन टेबल अच्छे अभ्यास का अनुसरण करता है और इसमें एक अद्वितीय यौगिक कुंजी परिभाषित है, यानी डुप्लिकेट पंक्तियों को रोकने के लिए एक बाधा, तो निम्न सरल क्वेरी की तरह कुछ करना चाहिए।

select conversation_id from conversations_users where user_id in (1, 2)
group by conversation_id having count(*) = 2

यह ध्यान रखना महत्वपूर्ण है कि अंत में संख्या 2 user_ids की सूची की लंबाई है। यह स्पष्ट रूप से बदलने की जरूरत है अगर user_id सूची लंबाई बदलती है। यदि आप यह नहीं मान सकते हैं कि आपकी ज्वाइन टेबल में डुप्लीकेट नहीं हैं, तो प्रदर्शन में कुछ संभावित लागत पर "गिनती (*)" को "गिनती (विशिष्ट उपयोगकर्ता_आईडी)" में बदलें।

यह क्वेरी उन सभी वार्तालापों को ढूंढती है जिनमें सभी निर्दिष्ट उपयोगकर्ता शामिल हैं भले ही बातचीत में अतिरिक्त उपयोगकर्ता भी शामिल हैं।

अगर आप केवल बिल्कुल . के साथ बातचीत चाहते हैं उपयोगकर्ताओं का निर्दिष्ट सेट, एक दृष्टिकोण नीचे दिए गए क्लॉज में नेस्टेड सबक्वेरी का उपयोग करना है। ध्यान दें, पहली और आखिरी पंक्तियाँ मूल क्वेरी के समान हैं, केवल बीच की दो पंक्तियाँ नई हैं।

select conversation_id from conversations_users where user_id in (1, 2)
   and conversation_id not in
   (select conversation_id from conversations_users where user_id not in (1,2))
group by conversation_id having count(*) = 2

समान रूप से, यदि आपका डेटाबेस इसका समर्थन करता है तो आप एक सेट अंतर ऑपरेटर का उपयोग कर सकते हैं। यहाँ Oracle सिंटैक्स में एक उदाहरण दिया गया है। (पोस्टग्रेज या डीबी2 के लिए, कीवर्ड "माइनस" को "सिवाय" में बदलें।)

select conversation_id from conversations_users where user_id in (1, 2)
  group by conversation_id having count(*) = 2
minus
  select conversation_id from conversations_users where user_id not in (1,2)

एक अच्छा क्वेरी अनुकूलक चाहिए अंतिम दो भिन्नताओं को समान रूप से मानें, लेकिन सुनिश्चित करने के लिए अपने विशेष डेटाबेस से जांचें। उदाहरण के लिए, Oracle 11GR2 क्वेरी प्लान माइनस ऑपरेटर को लागू करने से पहले वार्तालाप आईडी के दो सेट को सॉर्ट करता है, लेकिन अंतिम क्वेरी के लिए सॉर्ट चरण को छोड़ देता है। तो पंक्तियों, कोर, कैशे, इंडेक्स इत्यादि की संख्या जैसे कई कारकों के आधार पर क्वेरी योजना तेज हो सकती है।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Linux/Windows में PgBouncer लॉग्स को रोटेट कैसे करें?

  2. PostgreSQL में कनेक्शन प्रबंधन:एक गाइड

  3. Django-DB-माइग्रेशन:तालिका में परिवर्तन नहीं कर सकता क्योंकि इसमें ट्रिगर ईवेंट लंबित हैं

  4. आपदा वसूली के लिए PostgreSQL प्रतिकृति

  5. हर बार एक अलग क्रम में pg_dump डंप डेटाबेस पोस्टग्रेज करता है