PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Mam inne wyniki niż zapytanie o COUNT('e.id') lub COUNT(e.id)

'e.id' jest stałą łańcuchową, więc COUNT('e.id') jest tylko niezręcznym, mylącym sposobem powiedzenia COUNT(*) .

COUNT(e.id) , z drugiej strony, zlicza wszystkie wiersze w wyniku, w których e.id IS NOT NULL - od count() nie liczy wartości NULL.

Podręcznik dotyczący count() :

Jak widać, wewnętrznie istnieją nawet dwie oddzielne funkcje. Należy zauważyć, że count(*) jest nieco szybszy. Więc używaj tego, chyba że potrzebujesz drugi wariant. Powiązane:

Możesz odpowiedzieć:
"Ale e.id to PRIMARY KEY z core_employments , więc jest zdefiniowany NOT NULL !"

Ale to przeoczyłoby warunkowe LEFT JOIN w zapytaniu, które nadal wprowadza NULL wartości w Twoim NOT NULL kolumna, w której warunki sprzężenia nie są spełnione. Powiązane:

To powiedziawszy, LEFT [OUTER] JOIN również wprowadza w błąd. Warunek późniejszy

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

zmusza go do działania jak zwykły [INNER] JOIN . Po naprawieniu możesz równie dobrze uprościć:

having("COUNT(*) = 1")

A jeśli zależy Ci tylko na tym przynajmniej jeden powiązany wiersz istnieje w core_employments , tłumacząc na having("COUNT(*) >= 1") , lepszą (wyraźniejszą, szybszą) techniką w prostych przypadkach będzie EXISTS półzłącze :

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. Kubernetes timescaledb statefulset:Zmiany utracone podczas odtwarzania pod

  2. Mapowanie enum Java na enum Postgres za pomocą EclipseLink

  3. postgreSQL zmienia typ danych kolumny na znacznik czasu bez strefy czasowej

  4. Jak obliczyć różnicę między dwoma znacznikami czasu w PostgreSQL

  5. Użyj wartości wierszy jako kolumn w PostgreSQL