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 BYsloupců v seznamu cílů dotazu, když je primární klíč zadán vGROUP BYdolož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 BYaGROUP BYklauzule, ale ne vWHEREneboHAVINGdolož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.