Không thể? Đã chấp nhận thử thách. :)
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;
Điều này sẽ cung cấp cho bạn chính xác những gì bạn đang yêu cầu. Nếu employee
và department
không phải là số nguyên, được truyền đến kiểu phù hợp.
Mỗi nhận xét từ @ypercube:count () phải nằm trên cột items
không rỗng , vì vậy chúng tôi nhận được 0
cho tiêu chí không tồn tại, không phải 1
.
Ngoài ra, kéo thêm tiêu chí vào LEFT JOIN
điều kiện (i.available
trong trường hợp này), vì vậy bạn không loại trừ các tiêu chí không tồn tại.
Hiệu suất
Giải quyết câu hỏi bổ sung trong nhận xét.
Điều này sẽ hoạt động rất tốt. Với danh sách tiêu chí dài hơn, (LEFT) JOIN
có lẽ là phương pháp nhanh nhất.
Nếu bạn cần nó càng nhanh càng tốt, hãy đảm bảo tạo nhiều cột chỉ mục như:
CREATE INDEX items_some_name_idx ON items (employee, department);
If (employee, department)
phải là PRIMARY KEY
hoặc bạn phải có UNIQUE
ràng buộc trên hai cột, điều đó cũng sẽ thực hiện thủ thuật.