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

VÆLG ANTAL(*) - returner 0 sammen med grupperede felter, hvis der ikke er nogen matchende rækker

Ikke muligt? Udfordring accepteret. :)

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;

Dette vil give dig præcis hvad du beder om. Hvis employee og department er ikke heltal, cast til den matchende type.

Per kommentar fra @ypercube:count() skal være på en ikke-nul kolonne med items , så vi får 0 for ikke-eksisterende kriterier, ikke 1 .

Træk også yderligere kriterier op i LEFT JOIN betingelse (i.available i dette tilfælde), så du ikke udelukker ikke-eksisterende kriterier.

Ydeevne

Besvarelse af yderligere spørgsmål i kommentarfeltet.
Dette burde fungere meget godt. Med længere lister over kriterier, (LEFT) JOIN er nok den hurtigste metode.

Hvis du har brug for det så hurtigt som muligt, skal du sørge for at oprette en multicolumn indeks som:

CREATE INDEX items_some_name_idx ON items (employee, department);

Hvis (employee, department) skal være den PRIMARY KEY eller du skal have en UNIQUE begrænsning på de to kolonner, det ville også gøre det trick.



  1. Er en BLOB konverteret ved hjælp af det aktuelle/standardtegnsæt i MySQL?

  2. Hvor meget diskplads er nødvendig for at gemme en NULL-værdi ved hjælp af postgresql DB?

  3. Hvordan kan jeg erstatte parenteser til bindestreger i Oracle REGEXP_REPLACE-funktionen?

  4. IntegrityError duplikatnøgleværdi overtræder unik begrænsning - django/postgres