sql >> Base de Datos >  >> RDS >> PostgreSQL

Tengo diferentes resultados de la consulta de COUNT('e.id') o COUNT(e.id)

'e.id' es una constante de cadena, por lo que COUNT('e.id') es solo una forma incómoda y engañosa de decir COUNT(*) .

COUNT(e.id) , por otro lado, cuenta todas las filas en el resultado donde e.id IS NOT NULL - desde count() no cuenta valores NULOS.

El manual sobre count() :

Como puede ver, hay incluso dos funciones separadas internamente. Y cabe señalar que count(*) es un poco más rápido. Así que úsalo a menos que necesites la segunda variante. Relacionado:

Puede responder con:
"Pero e.id es la PRIMARY KEY de core_employments , por lo que se define NOT NULL !"

Pero eso pasaría por alto el condicional LEFT JOIN en su consulta que aún presenta NULL valores en su NOT NULL columna, donde no se cumplen las condiciones de unión. Relacionado:

Dicho esto, LEFT [OUTER] JOIN también es engañoso. La última condición

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

lo obliga a actuar como un simple [INNER] JOIN . Una vez que haya solucionado eso, también podría simplificar a:

having("COUNT(*) = 1")

Y si todo lo que te importa es eso al menos existe una fila relacionada en core_employments , que se traduce como having("COUNT(*) >= 1") , la técnica superior (más clara, más rápida) en casos simples sería EXISTS semi-unirse :

WHERE EXISTS (SELECT FROM core_employments WHERE <conditions>)