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)
Seit Postgres 9.1 deckt der Primärschlüssel alle Spalten einer Tabelle im GROUP BY
ab Klausel. In älteren Versionen müssten Sie a.limit_call
hinzufügen zu GROUP BY
aufführen. Die Versionshinweise für 9.1:
Nicht-GROUP BY
zulassen Spalten in der Abfragezielliste, wenn der Primärschlüssel in GROUP BY
angegeben ist Klausel
Weiterführende Literatur:
- Warum kann ich abhängige Spalten nicht von `GROUP BY` ausschließen, wenn ich nach einem Schlüssel aggregiere?
Die Bedingung, die Sie in WHERE
hatten -Klausel muss nach HAVING
verschoben werden -Klausel, da sie sich auf das Ergebnis einer Aggregatfunktion bezieht (after WHERE
angewendet wurde). Und Sie können nicht auf Ausgabespalten verweisen (Spaltenaliase) im HAVING
-Klausel, in der Sie nur auf Eingabespalten verweisen können. Sie müssen also den Ausdruck wiederholen. Das Handbuch:
Der Name einer Ausgabespalte kann verwendet werden, um auf den Wert der Spalte in ORDER BY
zu verweisen und GROUP BY
-Klauseln, aber nicht im WHERE
oder HAVING
Klauseln; dort müssen Sie stattdessen den Ausdruck ausschreiben.
Ich habe die Reihenfolge der Tabellen im FROM
umgekehrt -Klausel und bereinigte die Syntax ein wenig, um sie weniger verwirrend zu machen. USING
ist hier nur eine Notationshilfe.
Ich habe LEFT JOIN
verwendet statt JOIN
, sodass Sie Lizenzen ohne Protokolle überhaupt nicht ausschließen.
Nur Nicht-Null-Werte werden von count()
gezählt . Da Sie verwandte Einträge zählen möchten in der Tabelle "Log"
Es ist sicherer und etwas billiger, count(b.license_id)
zu verwenden . Diese Spalte wird im Join verwendet, sodass wir uns nicht darum kümmern müssen, ob die Spalte null sein kann oder nicht.count(*)
ist noch kürzer und etwas schneller, aber. Wenn es Ihnen nichts ausmacht, eine Zählung von 1
zu erhalten für 0
Zeilen in der linken Tabelle, verwenden Sie das.
Beiseite:Ich würde nicht raten um Bezeichner mit gemischter Groß-/Kleinschreibung zu verwenden in Postgres, wenn möglich. Sehr fehleranfällig.