संभव नहीं? चुनौती स्वीकार की गई। :)पी>
WITH x(employee, department) AS (
VALUES
(1::int, 2::int)
,(3, 4)
,(5, 6)
-- ... more combinations
)
SELECT x.employee, x.department, count(i.employee) AS ct
FROM x
LEFT JOIN items i ON i.employee = x.employee
AND i.department = x.department
AND i.available
GROUP BY x.employee, x.department;
यह आपको बिल्कुल देगा तुम क्या मांग रहे हो। अगर employee
और department
पूर्णांक नहीं हैं, मिलान प्रकार में डाले गए हैं।
@ypercube से प्रति टिप्पणी:गिनती () को items
के एक गैर-शून्य कॉलम पर होना चाहिए , इसलिए हमें 0
. मिलता है गैर-मौजूदा मानदंड के लिए, नहीं 1
।
साथ ही, LEFT JOIN
में अतिरिक्त मानदंड भी शामिल करें शर्त (i.available
इस मामले में), इसलिए आप गैर-मौजूदा मानदंडों को बाहर नहीं करते हैं।
प्रदर्शन
टिप्पणी में अतिरिक्त प्रश्न को संबोधित करना।
यह बहुत अच्छा प्रदर्शन करना चाहिए। मानदंड की लंबी सूची के साथ, (LEFT) JOIN
शायद सबसे तेज़ तरीका है।
यदि आपको जितनी जल्दी हो सके इसकी आवश्यकता है, एक बहुस्तंभ बनाना सुनिश्चित करें अनुक्रमणिका जैसे:
CREATE INDEX items_some_name_idx ON items (employee, department);
अगर (employee, department)
PRIMARY KEY
होना चाहिए या आपके पास UNIQUE
होना चाहिए दो स्तंभों पर बाधा, यह भी काम करेगा।