sql >> Database >  >> RDS >> PostgreSQL

SELECTEER AANTAL(*) - retourneer 0 samen met gegroepeerde velden als er geen overeenkomende rijen zijn

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.



  1. Wat is het verschil tussen CASE en IF in mysql

  2. zal pg_restore de bestaande tabellen overschrijven?

  3. PHP MySQL DATA INFILE LADEN Help

  4. Het equivalent van de identiteitskolom van een SQL Server maken in Postgres