PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

J'ai des résultats différents de la requête pour COUNT('e.id') ou COUNT(e.id)

'e.id' est une constante de chaîne, donc COUNT('e.id') est juste une façon maladroite et trompeuse de dire COUNT(*) .

COUNT(e.id) , d'autre part, compte toutes les lignes du résultat où e.id IS NOT NULL - depuis count() ne compte pas les valeurs NULL.

Le manuel sur count() :

Comme vous pouvez le constater, il existe même deux fonctions distinctes en interne. Et il convient de noter que count(*) est légèrement plus rapide. Alors utilisez-le sauf si vous en avez besoin la deuxième variante. Connexe :

Vous pourriez contrer avec :
"Mais e.id est la PRIMARY KEY de core_employments , il est donc défini NOT NULL !"

Mais cela négligerait le conditionnel LEFT JOIN dans votre requête qui introduit toujours NULL valeurs dans votre NOT NULL colonne, où les conditions de jointure ne sont pas remplies. Connexe :

Cela dit, LEFT [OUTER] JOIN est trompeur aussi. La dernière condition

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

le force à agir comme un simple [INNER] JOIN . Une fois que vous avez corrigé cela, autant simplifier :

having("COUNT(*) = 1")

Et si tout ce qui vous importe, c'est que au moins une ligne associée existe dans core_employments , se traduisant par having("COUNT(*) >= 1") , la technique supérieure (plus claire, plus rapide) dans les cas simples serait un EXISTS semi-jointure :

WHERE EXISTS (SELECT FROM core_employments WHERE <conditions>)