PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

PostgreSQL dove condizione di conteggio

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.