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.