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 leGROUP 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
etGROUP BY
clauses, mais pas dansWHERE
ouHAVING
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.