PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Eu tenho resultados diferentes da consulta para COUNT('e.id') ou COUNT(e.id)


'e.id' é uma constante de string, então COUNT('e.id') é apenas uma maneira estranha e enganosa de dizer COUNT(*) .

COUNT(e.id) , por outro lado, conta todas as linhas no resultado onde e.id IS NOT NULL - desde count() não conta valores NULL.

O manual sobre count() :

Como você pode ver, existem até duas funções separadas internamente. E deve-se notar que count(*) é um pouco mais rápido. Então use isso a menos que você precisa a segunda variante. Relacionado:

Você pode responder com:
"Mas e.id é a PRIMARY KEY de core_employments , então é definido NOT NULL !"

Mas isso ignoraria o condicional LEFT JOIN em sua consulta que ainda apresenta NULL valores em seu NOT NULL coluna, onde as condições de junção não são atendidas. Relacionado:

Dito isso, LEFT [OUTER] JOIN também é enganoso. A condição posterior
having("COUNT(e.id) = 1")

força-o a agir como um simples [INNER] JOIN . Depois de corrigir isso, você também pode simplificar para:
having("COUNT(*) = 1")

E se tudo o que importa é que pelo menos existe uma linha relacionada em core_employments , traduzindo para having("COUNT(*) >= 1") , a técnica superior (mais clara, mais rápida) em casos simples seria uma EXISTS semi-juntar :
WHERE EXISTS (SELECT FROM core_employments WHERE <conditions>)