Невъзможно? Предизвикателството е прието. :)
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:count() трябва да бъде в ненулева колона от items
, така че получаваме 0
за несъществуващи критерии, а не 1
.
Освен това изтеглете допълнителни критерии в LEFT JOIN
състояние (i.available
в този случай), така че да не изключвате несъществуващи критерии.
Ефективност
Адресиране на допълнителен въпрос в коментар.
Това трябва да се представи много добре. С по-дълги списъци с критерии, (LEFT) JOIN
е може би най-бързият метод.
Ако имате нужда от него възможно най-бързо, не забравяйте да създадете мултиколона индекс като:
CREATE INDEX items_some_name_idx ON items (employee, department);
Ако (employee, department)
трябва да бъде PRIMARY KEY
или трябва да имате UNIQUE
ограничение върху двете колони, това също би свършило работа.