sql >> Databáze >  >> RDS >> PostgreSQL

SELECT COUNT(*) - vrátí 0 spolu se seskupenými poli, pokud neexistují žádné odpovídající řádky

Nemožné? Výzva přijata. :)

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;

Tím získáte přesně o co žádáte. Pokud employee a department nejsou celé číslo, přetypují se na odpovídající typ.

Za komentář od @ypercube:count() musí být v nenulovém sloupci items , takže dostaneme 0 pro neexistující kritérium, nikoli 1 .

Také vytáhněte další kritéria do LEFT JOIN stav (i.available v tomto případě), takže nevyloučíte neexistující kritéria.

Výkon

Doplňující dotaz v komentáři.
To by mělo fungovat velmi dobře. S delšími seznamy kritérií (LEFT) JOIN je pravděpodobně nejrychlejší metoda.

Pokud to potřebujete co nejrychleji, nezapomeňte si vytvořit multicolumn index jako:

CREATE INDEX items_some_name_idx ON items (employee, department);

Pokud (employee, department) by měl být PRIMARY KEY nebo byste měli mít UNIQUE omezení na dva sloupce, to by taky stačilo.



  1. Spuštění více instancí PostgreSQL na jednom hostiteli

  2. Aktualizujte data aktivity ze služby, když je pozastavena

  3. Nahraďte znaky unicode v PostgreSQL

  4. Chyba syntaxe vnitřního spojení laravel 5 a skupiny podle dotazu