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 format GROUP BY
clause. Dans les anciennes versions, vous deviez ajouter a.limit_call
à la GROUP BY
liste. Le site notes de mise à jour de la 9.1 :
Permettre aux non GROUP BY
dans la liste des cibles de la requête lorsque la clé primaire est spécifiée dans le champ GROUP BY
clause
Pour en savoir plus :
La condition que vous aviez dans le WHERE
La clause doit être déplacée vers la HAVING
puisqu'elle fait référence au résultat d'une fonction d'agrégation ( après WHERE
a été appliquée). Et vous ne pouvez pas faire référence à colonnes de sortie (alias de colonne) dans le HAVING
où vous ne pouvez faire référence qu'aux colonnes d'entrée. Vous devez donc répéter l'expression. Le manuel :
Le nom d'une colonne de sortie peut être utilisé pour se référer à la valeur de la colonne dans le fichier ORDER BY
y GROUP BY
mais pas dans les clauses WHERE
ou HAVING
dans lesquelles vous devez écrire l'expression à la place.
J'ai inversé l'ordre des tables dans le FROM
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 enregistrement.
Seules les valeurs non nulles sont comptées par count()
. Puisque vous voulez compter entrées associées en table "Log"
il est plus sûr et légèrement moins cher à utiliser count(b.license_id)
. Cette colonne est utilisée dans la jointure, donc nous n'avons pas à nous soucier de savoir si la colonne peut être nulle ou non.
count(*)
est encore plus court et légèrement plus rapide, pourtant. Si ça ne vous dérange pas d'avoir un compte de 1
para 0
dans le tableau de gauche, utilisez-les.
A propos : je conseillerais no à utiliser identifiants en majuscules et en minuscules dans Postgres si possible. Très propice aux erreurs.