sql >> Databasteknik >  >> RDS >> PostgreSQL

VÄLJ ANTAL(*) - returnera 0 tillsammans med grupperade fält om det inte finns några matchande rader

Omöjligt? Utmaning accepterad. :)

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;

Detta ger dig exakt vad du efterfrågar. Om employee och department är inte heltal, cast till den matchande typen.

Per kommentar från @ypercube:count() måste finnas på en icke-null kolumn med items , så vi får 0 för icke-existerande kriterier, inte 1 .

Dra också upp ytterligare kriterier i LEFT JOIN skick (i.available i det här fallet), så att du inte utesluter icke-existerande kriterier.

Prestanda

Besvarar ytterligare frågor i kommentaren.
Detta borde fungera mycket bra. Med längre listor med kriterier, (LEFT) JOIN är förmodligen den snabbaste metoden.

Om du behöver det så snabbt som möjligt, se till att skapa en flerkolumn index gillar:

CREATE INDEX items_some_name_idx ON items (employee, department);

Om (employee, department) ska vara PRIMARY KEY eller så bör du ha en UNIQUE begränsning på de två kolumnerna, det skulle också göra susen.



  1. Hur infogar jag ett datum i mysql som en parameter?

  2. wp-admin kan inte komma åt efter flyttning

  3. Vad är standardnamnet för begränsningar i SQL Server?

  4. Rälsmodell med främmande nyckel till sig själv