PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Condition PostgreSQL Where count

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)

Depuis Postgres 9.1, la clé primaire couvre toutes les colonnes d'une table dans le GROUP BY clause. Dans les anciennes versions, vous deviez ajouter a.limit_call au GROUP BY liste. Les notes de version pour 9.1 :

Autoriser non-GROUP BY colonnes dans la liste cible de la requête lorsque la clé primaire est spécifiée dans le GROUP BY clause

Lectures complémentaires :

  • Pourquoi ne puis-je pas exclure des colonnes dépendantes de `GROUP BY` lorsque j'agrège par clé ?

La condition que vous aviez dans WHERE la clause doit être déplacée vers HAVING clause car elle fait référence au résultat d'une fonction d'agrégation (après WHERE a été appliqué). Et vous ne pouvez pas faire référence aux colonnes de sortie (alias de colonne) dans le HAVING clause, où vous ne pouvez référencer que des colonnes d'entrée. Il faut donc répéter l'expression. Le manuel :

Le nom d'une colonne de sortie peut être utilisé pour faire référence à la valeur de la colonne dans ORDER BY et GROUP BY clauses, mais pas dans WHERE ou HAVING clauses ; là, vous devez écrire l'expression à la place.

J'ai inversé l'ordre des tables dans le FROM clause et nettoyé un peu la syntaxe pour la rendre moins confuse. USING est juste une commodité de notation ici.

J'ai utilisé LEFT JOIN au lieu de JOIN , afin de ne pas exclure les licences sans aucun journal.

Seules les valeurs non nulles sont comptées par count() . Puisque vous voulez compter les entrées liées dans le tableau "Log" il est plus sûr et légèrement moins cher d'utiliser count(b.license_id) . Cette colonne est utilisée dans la jointure, nous n'avons donc pas à nous soucier de savoir si la colonne peut être nulle ou non.
count(*) est encore plus court et légèrement plus rapide. Si cela ne vous dérange pas d'obtenir un décompte de 1 pour 0 lignes dans le tableau de gauche, utilisez-les.

A part :je ne conseillerais pas utiliser des identifiants à casse mixte dans Postgres si possible. Très sujet aux erreurs.