PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

SELECT COUNT(*) - restituisce 0 insieme ai campi raggruppati se non ci sono righe corrispondenti

Non possibile? Sfida accettata. :)

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;

Questo ti darà esattamente quello che stai chiedendo. Se employee e department non sono interi, esegui il cast nel tipo corrispondente.

Per commento di @ypercube:count() deve trovarsi su una colonna non nulla di items , quindi otteniamo 0 per criteri inesistenti, non 1 .

Inoltre, richiama criteri aggiuntivi in ​​LEFT JOIN condizione (i.available in questo caso), quindi non escludi criteri inesistenti.

Prestazioni

Affrontare ulteriori domande nel commento.
Questo dovrebbe funzionare molto bene. Con elenchi di criteri più lunghi, (LEFT) JOIN è probabilmente il metodo più veloce.

Se ne hai bisogno il più velocemente possibile, assicurati di creare una multicolonna indice come:

CREATE INDEX items_some_name_idx ON items (employee, department);

Se (employee, department) dovrebbe essere la PRIMARY KEY oppure dovresti avere un UNIQUE vincolo sulle due colonne, anche questo farebbe il trucco.