sql >> Databáze >  >> RDS >> PostgreSQL

Mám odlišné výsledky z dotazu pro COUNT('e.id') nebo COUNT(e.id)

'e.id' je řetězcová konstanta, takže COUNT('e.id') je jen nepříjemný, zavádějící způsob vyjádření COUNT(*) .

COUNT(e.id) , na druhou stranu počítá všechny řádky ve výsledku, kde e.id IS NOT NULL - od count() nepočítá hodnoty NULL.

Příručka o count() :

Jak vidíte, interně existují dokonce dvě samostatné funkce. A je třeba poznamenat, že count(*) je o něco rychlejší. Takže to používejte, pokud to nepotřebujete druhá varianta. Související:

Můžete oponovat:
"Ale e.id." je PRIMARY KEY z core_employments , takže je definováno NOT NULL !"

To by ale přehlédlo podmíněné LEFT JOIN ve vašem dotazu, který stále zavádí NULL hodnoty ve vašem NOT NULL sloupec, kde nejsou splněny podmínky spojení. Související:

To znamená LEFT [OUTER] JOIN je také zavádějící. Pozdější podmínka

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

nutí jej, aby se choval jako prostý [INNER] JOIN . Jakmile to opravíte, můžete to také zjednodušit na:

having("COUNT(*) = 1")

A pokud vás zajímá jen to aspoň v core_employments existuje jeden související řádek , v překladu having("COUNT(*) >= 1") , lepší (jasnější, rychlejší) technika by v jednoduchých případech byla EXISTS poloviční spojení :

WHERE EXISTS (SELECT FROM core_employments WHERE <conditions>)



  1. Jak vytvořit zálohu jedné tabulky v databázi postgres?

  2. SQL vyhledávání v množném/jednotném čísle

  3. jaký je rozdíl mezi UNIQUE INDEX a UNIQUE KEY?

  4. Jak používat LIKE pro vyhledávání v mysql s JOIN a ORDER BY podle počtu nejvíce řádků/hlasů v tabulce hlasování?