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

Ho risultati diversi dalla query per COUNT('e.id') o COUNT(e.id)

'e.id' è una costante stringa, quindi COUNT('e.id') è solo un modo goffo e fuorviante per dire COUNT(*) .

COUNT(e.id) , d'altra parte, conta tutte le righe nel risultato in cui e.id IS NOT NULL - poiché count() non conta i valori NULL.

Il manuale su count() :

Come puoi vedere, ci sono anche due funzioni separate internamente. E va notato che count(*) è leggermente più veloce. Quindi usalo a meno che tu non ne abbia necessità la seconda variante. Correlati:

Potresti rispondere con:
"Ma e.id è la PRIMARY KEY di core_employments , quindi è definito NOT NULL !"

Ma ciò trascurerebbe il condizionale LEFT JOIN nella tua query che introduce ancora NULL valori nel tuo NOT NULL colonna, dove le condizioni di unione non sono soddisfatte. Correlati:

Detto questo, LEFT [OUTER] JOIN è anche fuorviante. La condizione successiva

having("COUNT(e.id) = 1")

lo costringe ad agire come un semplice [INNER] JOIN . Una volta risolto il problema, potresti anche semplificare in:

having("COUNT(*) = 1")

E se tutto ciò che ti interessa è che almeno esiste una riga correlata in core_employments , traducendo in having("COUNT(*) >= 1") , la tecnica superiore (più chiara, più veloce) nei casi semplici sarebbe un EXISTS semi-unirsi :

WHERE EXISTS (SELECT FROM core_employments WHERE <conditions>)