SELECT a.license_id, a.limit_call
, count(b.license_id) AS overall_count
FROM "License" a
LEFT JOIN "Log" b USING (license_id)
WHERE a.license_id = 7
GROUP BY a.license_id -- , a.limit_call -- add in old versions
HAVING a.limit_call > count(b.license_id)
Od Postgres 9.1 pokrývá primární klíč všechny sloupce tabulky v GROUP BY
doložka. Ve starších verzích byste museli přidat a.limit_call
do GROUP BY
seznam. Poznámky k vydání pro 9.1:
Povolit jiné než
GROUP BY
sloupců v seznamu cílů dotazu, když je primární klíč zadán vGROUP BY
doložka
Další čtení:
- Proč nemohu vyloučit závislé sloupce ze „GROUP BY“, když agreguji podle klíče?
Stav, který jste měli v WHERE
klauzule se musí přesunout do HAVING
klauzule, protože odkazuje na výsledek agregační funkce (po WHERE
bylo aplikováno). A nemůžete odkazovat na výstupní sloupce (aliasy sloupců) v HAVING
klauzule, kde můžete odkazovat pouze na vstupní sloupce. Musíte tedy výraz zopakovat. Manuál:
Název výstupního sloupce lze použít jako odkaz na hodnotu sloupce v
ORDER BY
aGROUP BY
klauzule, ale ne vWHERE
neboHAVING
doložky; tam musíte místo toho napsat výraz.
Obrátil jsem pořadí tabulek v FROM
klauzuli a trochu vyčistili syntaxi, aby byla méně matoucí. USING
je zde pouze vymoženost zápisu.
Použil jsem LEFT JOIN
místo JOIN
, takže nevyloučíte licence bez jakýchkoli protokolů.
Funkce count()
počítá pouze hodnoty, které nejsou nulové . Protože chcete počítat související položky v tabulce "Log"
je bezpečnější a o něco levnější použít count(b.license_id)
. Tento sloupec se používá ve spojení, takže se nemusíme obtěžovat, zda sloupec může být prázdný nebo ne.count(*)
je ještě kratší a o něco rychlejší. Pokud vám nevadí získat počet 1
pro 0
řádků v levé tabulce, použijte to.
Stranou:Doporučuji ne používat smíšené identifikátory velkých a malých písmen pokud možno v Postgresu. Velmi náchylné k chybám.