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

Ich habe unterschiedliche Ergebnisse von der Abfrage für COUNT('e.id') oder COUNT(e.id)

'e.id' ist eine String-Konstante, also COUNT('e.id') ist nur eine umständliche, irreführende Art, COUNT(*) zu sagen .

COUNT(e.id) hingegen zählt alle Zeilen im Ergebnis, in denen e.id IS NOT NULL ist - seit count() zählt keine NULL-Werte.

Das Handbuch zu count() :

Wie Sie sehen können, gibt es intern sogar zwei getrennte Funktionen. Und es sollte beachtet werden, dass count(*) ist etwas schneller. Verwenden Sie das also, es sei denn, Sie brauchen die zweite Variante. Verwandte:

Sie könnten kontern mit:
"Aber e.id ist der PRIMARY KEY von core_employments , also ist es definiert NOT NULL !"

Aber das würde den bedingten LEFT JOIN übersehen in Ihrer Abfrage, die immer noch NULL einführt Werte in Ihrem NOT NULL Spalte, in der die Join-Bedingungen nicht erfüllt sind. Verwandte:

Das heißt, LEFT [OUTER] JOIN ist auch irreführend. Die spätere Bedingung

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

zwingt es, sich wie ein einfacher [INNER] JOIN zu verhalten . Sobald Sie das behoben haben, können Sie genauso gut vereinfachen zu:

having("COUNT(*) = 1")

Und wenn Sie sich nur darum kümmern, zumindest eine zugehörige Zeile existiert in core_employments , übersetzt in having("COUNT(*) >= 1") , wäre die überlegene (klarere, schnellere) Technik in einfachen Fällen ein EXISTS Semi-Join :

WHERE EXISTS (SELECT FROM core_employments WHERE <conditions>)