SELECT a.license_id, a.limit_call
, count(b.license_id) AS overall_count
FROM "License" a
LEFT JOIN "Log" b USING (license_id)
WHERE a.license_id = 7
GROUP BY a.license_id -- , a.limit_call -- add in old versions
HAVING a.limit_call > count(b.license_id)
चूंकि 9.1 पोस्टग्रेज प्राथमिक कुंजी GROUP BY
में तालिका के सभी स्तंभों को कवर करती है खंड। पुराने संस्करणों में आपको a.limit_call
. जोड़ना होगा GROUP BY
. पर सूची। 9.1 के लिए रिलीज़ नोट:
गैर-GROUP BY
. को अनुमति दें जब प्राथमिक कुंजी GROUP BY
. में निर्दिष्ट की जाती है, तो क्वेरी लक्ष्य सूची में कॉलम खंड
आगे पढ़ना:
- जब मैं एक कुंजी द्वारा एकत्र करता हूं, तो मैं 'ग्रुप बाय' से आश्रित कॉलम को क्यों नहीं निकाल सकता?
WHERE
. में आपके पास जो स्थिति थी क्लॉज को HAVING
. पर ले जाना है खंड क्योंकि यह एक समग्र कार्य के परिणाम को संदर्भित करता है (बाद WHERE
लागू किया है)। और आप आउटपुट कॉलम का संदर्भ नहीं ले सकते हैं (कॉलम उपनाम) HAVING
. में क्लॉज, जहां आप केवल इनपुट कॉलम का संदर्भ दे सकते हैं। तो आपको अभिव्यक्ति दोहरानी होगी। मैनुअल:
ORDER BY
में कॉलम के मान को संदर्भित करने के लिए आउटपुट कॉलम के नाम का उपयोग किया जा सकता है और GROUP BY
खंड, लेकिन WHERE
. में नहीं या HAVING
खंड; वहां आपको इसके बजाय व्यंजक लिखना होगा।
मैंने FROM
. में तालिकाओं के क्रम को उलट दिया क्लॉज और सिंटैक्स को कम भ्रमित करने के लिए थोड़ा सा साफ किया। USING
यहाँ केवल एक उल्लेखनीय सुविधा है।
मैंने LEFT JOIN
. का उपयोग किया JOIN
. के बजाय , इसलिए आप बिना किसी लॉग के लाइसेंस को बिल्कुल भी बाहर नहीं करते हैं।
केवल गैर-शून्य मानों की गणना count()
द्वारा की जाती है . चूंकि आप संबंधित प्रविष्टियों की गणना करना चाहते हैं तालिका में "Log"
count(b.license_id)
. का उपयोग करना सुरक्षित और थोड़ा सस्ता है . इस कॉलम का उपयोग जॉइन में किया जाता है, इसलिए हमें परेशान होने की जरूरत नहीं है कि कॉलम शून्य हो सकता है या नहीं।count(*)
और भी छोटा और थोड़ा तेज़ है, फिर भी। यदि आपको 1
. की गिनती प्राप्त करने में कोई आपत्ति नहीं है 0
. के लिए बाईं तालिका में पंक्तियाँ, उसका उपयोग करें।
इसके अलावा:मैं सलाह दूंगा नहीं मिश्रित केस पहचानकर्ताओं . का उपयोग करने के लिए यदि संभव हो तो पोस्टग्रेज में। बहुत त्रुटि प्रवण।