PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Имам различни резултати от заявка за COUNT('e.id') или COUNT(e.id)

'e.id' е низова константа, така че COUNT('e.id') е просто неудобен, подвеждащ начин да се каже COUNT(*) .

COUNT(e.id) , от друга страна, брои всички редове в резултата, където e.id IS NOT NULL - от count() не отчита NULL стойности.

Ръководството за count() :

Както можете да видите, има дори две отделни функции вътрешно. И трябва да се отбележи, че count(*) е малко по-бързо. Така че използвайте го, освен ако не имате нужда вторият вариант. Свързани:

Може да контрирате с:
„Но e.id е PRIMARY KEY от core_employments , така че е дефиниран NOT NULL !"

Но това би пренебрегнало условното LEFT JOIN във вашата заявка, която все още въвежда NULL стойности във вашия NOT NULL колона, където условията за присъединяване не са изпълнени. Свързани:

Това каза, LEFT [OUTER] JOIN също е подвеждащо. По-късното условие

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

принуждава го да действа като обикновен [INNER] JOIN . След като поправите това, можете също така да опростите до:

having("COUNT(*) = 1")

И ако всичко, което ви интересува, е поне един свързан ред съществува в core_employments , което се превежда на having("COUNT(*) >= 1") , по-добрата (по-ясна, по-бърза) техника в прости случаи би била EXISTS полусъединяване :

WHERE EXISTS (SELECT FROM core_employments WHERE <conditions>)



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Postgres - Изтеглете копие на цяла DB от отдалечен сървър към локална машина за разработка

  2. SQLalchemy не извършва промени при задаване на роля

  3. Как да форматирам bigint поле в дата в Postgresql?

  4. Решаване на грешка:открит нов ред в данните в Postgres?

  5. как да се пагинира изберете на slick + postgresql