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)
Da Postgres 9.1 la chiave primaria copre tutte le colonne di una tabella nel GROUP BY
clausola. Nelle versioni precedenti dovresti aggiungere a.limit_call
al GROUP BY
elenco. Le note di rilascio per 9.1:
Consenti non GROUP BY
colonne nell'elenco di destinazione della query quando la chiave primaria è specificata in GROUP BY
clausola
Ulteriori letture:
- Perché non posso escludere le colonne dipendenti da `GRUPPO PER` quando aggrego per chiave?
La condizione che avevi nel WHERE
la clausola deve passare a HAVING
clausola poiché si riferisce al risultato di una funzione aggregata (dopo WHERE
è stato applicato). E non puoi fare riferimento a colonne di output (alias di colonna) in HAVING
clausola, in cui puoi fare riferimento solo alle colonne di input. Quindi devi ripetere l'espressione. Il manuale:
Il nome di una colonna di output può essere utilizzato per fare riferimento al valore della colonna inORDER BY
e GROUP BY
clausole, ma non in WHERE
o HAVING
clausole; lì devi invece scrivere l'espressione.
Ho invertito l'ordine delle tabelle nel FROM
clausola e ripulito un po' la sintassi per renderla meno confusa. USING
è solo una comodità di notazione qui.
Ho usato LEFT JOIN
invece di JOIN
, quindi non escludi affatto le licenze senza alcun registro.
Solo i valori non nulli vengono conteggiati da count()
. Dal momento che vuoi contare voci correlate nella tabella "Log"
è più sicuro e leggermente più economico usare count(b.license_id)
. Questa colonna viene utilizzata nel join, quindi non dobbiamo preoccuparci se la colonna può essere nulla o meno.count(*)
è ancora più breve e leggermente più veloce, tuttavia. Se non ti dispiace ottenere un conteggio di 1
per 0
righe nella tabella di sinistra, usa quella.
A parte:consiglierei di non per utilizzare identificatori di casi misti a Postgres se possibile. Molto soggetto a errori.