PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

PostgreSQL-Where-Count-Bedingung

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.