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)
Sinds Postgres 9.1 dekt de primaire sleutel alle kolommen van een tabel in de GROUP BY clausule. In oudere versies zou je a.limit_call . moeten toevoegen naar de GROUP BY lijst. De release-opmerkingen voor 9.1:
Niet-
GROUP BYAllow toestaan kolommen in de zoekdoellijst wanneer de primaire sleutel is opgegeven in deGROUP BYclausule
Verder lezen:
- Waarom kan ik afhankelijke kolommen niet uitsluiten van `GROUP BY` als ik aggregeer met een sleutel?
De voorwaarde die u had in de WHERE clausule moet worden verplaatst naar de HAVING clausule omdat het verwijst naar het resultaat van een aggregatiefunctie (na WHERE is aangebracht). En u kunt niet verwijzen naar uitvoerkolommen (kolom aliassen) in de HAVING clausule, waar u alleen naar invoerkolommen kunt verwijzen. Dus je moet de uitdrukking herhalen. De handleiding:
De naam van een uitvoerkolom kan worden gebruikt om te verwijzen naar de waarde van de kolom in
ORDER BYenGROUP BYclausules, maar niet in deWHEREofHAVINGclausules; daar moet je in plaats daarvan de uitdrukking uitschrijven.
Ik heb de volgorde van de tabellen in de FROM . omgedraaid clausule en de syntaxis een beetje opgeschoond om het minder verwarrend te maken. USING is hier slechts een notatie gemak.
Ik gebruikte LEFT JOIN in plaats van JOIN , dus u sluit geen licenties uit zonder logboeken.
Alleen niet-null-waarden worden geteld door count() . Omdat je gerelateerde inzendingen wilt tellen in tabel "Log" het is veiliger en iets goedkoper om count(b.license_id) . te gebruiken . Deze kolom wordt gebruikt in de join, dus we hoeven ons geen zorgen te maken of de kolom null kan zijn of niet.count(*) is nog korter en iets sneller, maar toch. Als je het niet erg vindt om 1 te tellen voor 0 rijen in de linkertabel, gebruik die.
Terzijde:ik zou adviseren niet om identifiers voor hoofdletters en kleine letters te gebruiken in Postgres indien mogelijk. Zeer foutgevoelig.