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

PostgreSQL - सहसंबद्ध उप-क्वेरी विफल?

SQL का उपयोग करने के बारे में कुछ महत्वपूर्ण बिंदु:

  • आप WHERE क्लॉज में कॉलम एलियासेस का उपयोग नहीं कर सकते हैं, लेकिन आप HAVING क्लॉज में कर सकते हैं। आपको मिली त्रुटि का कारण यही है।
  • सहसंबद्ध उपश्रेणियों का उपयोग करने की तुलना में आप JOIN और GROUP BY का उपयोग करके अपनी गणना बेहतर तरीके से कर सकते हैं। यह बहुत तेज़ होगा।
  • समूहों को फ़िल्टर करने के लिए HAVING क्लॉज़ का उपयोग करें।

इस तरह मैं इस क्वेरी को लिखूंगा:

SELECT t1.id, COUNT(t2.id) AS num_things
FROM t1 JOIN t2 USING (id)
GROUP BY t1.id
HAVING num_things = 5;

मुझे एहसास है कि यह क्वेरी JOIN को छोड़ सकती है t1 के साथ, जैसा कि चार्ल्स ब्रेटाना के समाधान में है। लेकिन मुझे लगता है कि आप चाहते हैं कि क्वेरी में t1 से कुछ अन्य कॉलम शामिल हों।

पुन:टिप्पणी में प्रश्न:

अंतर यह है कि WHERE क्लॉज का मूल्यांकन पंक्तियों पर किया जाता है, GROUP BY . से पहले समूहों को प्रति समूह एक पंक्ति में कम कर देता है। HAVING समूह बनने के बाद खंड का मूल्यांकन किया जाता है। इसलिए, उदाहरण के लिए, आप COUNT() . को नहीं बदल सकते HAVING . का उपयोग करके किसी समूह का; आप केवल समूह को ही बाहर कर सकते हैं।

SELECT t1.id, COUNT(t2.id) as num
FROM t1 JOIN t2 USING (id)
WHERE t2.attribute = <value>
GROUP BY t1.id
HAVING num > 5;

उपरोक्त क्वेरी में, WHERE किसी शर्त से मेल खाने वाली पंक्तियों के लिए फ़िल्टर, और HAVING उन समूहों के लिए फ़िल्टर जिनकी संख्या कम से कम पाँच है।

अधिकांश लोगों को भ्रम की स्थिति तब होती है जब उनके पास GROUP BY . नहीं होता है खंड, तो यह लगता है जैसे HAVING और WHERE विनिमेय हैं।

WHERE चयन-सूची में अभिव्यक्तियों से पहले मूल्यांकन किया जाता है। यह स्पष्ट नहीं हो सकता है क्योंकि SQL सिंटैक्स पहले चयन-सूची रखता है। तो आप WHERE . का उपयोग करके बहुत सारी महंगी गणनाओं को बचा सकते हैं पंक्तियों को प्रतिबंधित करने के लिए।

SELECT <expensive expressions>
FROM t1
HAVING primaryKey = 1234;

यदि आप ऊपर की तरह एक क्वेरी का उपयोग करते हैं, तो चयन-सूची में अभिव्यक्तियों की गणना हर पंक्ति के लिए की जाती है , केवल HAVING . के कारण अधिकांश परिणामों को त्यागने के लिए स्थि‍ति। हालांकि, नीचे दी गई क्वेरी केवल एकल पंक्ति . के लिए व्यंजक की गणना करती है WHERE से मेल खाता है हालत।

SELECT <expensive expressions>
FROM t1
WHERE primaryKey = 1234;

तो संक्षेप में, चरणों की श्रृंखला के अनुसार डेटाबेस इंजन द्वारा क्वेरी चलाई जाती हैं:

  1. तालिका(ओं) से पंक्तियों का सेट उत्पन्न करें, जिसमें JOIN . द्वारा उत्पादित कोई भी पंक्तियाँ शामिल हैं ।
  2. मूल्यांकन करें WHERE पंक्तियों के समूह के विरुद्ध स्थितियां, मेल न खाने वाली पंक्तियों को फ़िल्टर करना।
  3. पंक्तियों के समूह में प्रत्येक के लिए चयन-सूची में भावों की गणना करें।
  4. कॉलम उपनाम लागू करें (ध्यान दें कि यह एक अलग चरण है, जिसका अर्थ है कि आप चयन-सूची में अभिव्यक्तियों में उपनामों का उपयोग नहीं कर सकते हैं)।
  5. GROUP BY . के अनुसार, समूहों को प्रति समूह एक पंक्ति में संघनित करें खंड।
  6. मूल्यांकन करें HAVING समूहों के विरुद्ध स्थितियां, मेल न खाने वाले समूहों को फ़िल्टर करना।
  7. परिणाम को ORDER BY के अनुसार क्रमित करें खंड।


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PostgreSQL LIKE क्वेरी प्रदर्शन विविधताएं

  2. क्नेक्स चुपचाप पोस्टग्रेज टाइमस्टैम्प को टाइमज़ोन के साथ परिवर्तित करता है और गलत समय देता है

  3. pgAudit का उपयोग करके PostgreSQL का ऑडिट करना

  4. मैं एसक्यूएल पोस्टग्रेज में कॉलम में सबसे बड़ा मूल्य कैसे ढूंढूं?

  5. पोस्टग्रेस्क्ल सेल्फ जॉइन