संभव नहीं? चुनौती स्वीकार की गई। :)पी>
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 होना चाहिए दो स्तंभों पर बाधा, यह भी काम करेगा।