Niet mogelijk? Uitdaging aanvaard. :)
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;
Dit geeft je precies waar je om vraagt. Als employee en department zijn geen geheel getal, cast naar het overeenkomende type.
Per opmerking van @ypercube:count() moet in een niet-null-kolom van items staan , dus we krijgen 0 voor niet-bestaande criteria, niet 1 .
Haal ook aanvullende criteria op in de LEFT JOIN staat (i.available in dit geval), zodat u niet-bestaande criteria niet uitsluit.
Prestaties
Aanvullende vraag in commentaar beantwoorden.
Dit zou zeer goed moeten presteren. Met langere lijsten met criteria, (LEFT) JOIN is waarschijnlijk de snelste methode.
Als je het zo snel mogelijk nodig hebt, zorg er dan voor dat je een multicolumn maakt index zoals:
CREATE INDEX items_some_name_idx ON items (employee, department);
Als (employee, department) moet de PRIMARY KEY . zijn of je moet een UNIQUE . hebben beperking op de twee kolommen, dat zou ook voldoende zijn.