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

Podmínka počtu PostgreSQL Where

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 v GROUP 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 vORDER BY a GROUP BY klauzule, ale ne v WHERE nebo HAVING 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.



  1. Zobrazuji obrázek z databáze PostgreSQL, bytea

  2. Jak řešit problémy s ORA-02049 a se zámkem obecně s Oracle

  3. Získejte seznam dat mezi dvěma daty pomocí funkce

  4. Připojení k databázi Oracle pomocí Sql Server Integration Services