sql >> Database >  >> RDS >> PostgreSQL

Ik heb andere resultaten van de zoekopdracht voor COUNT('e.id') of COUNT(e.id)

'e.id' is een stringconstante, dus COUNT('e.id') is gewoon een ongemakkelijke, misleidende manier om COUNT(*) . te zeggen .

COUNT(e.id) , aan de andere kant, telt alle rijen in het resultaat waar e.id IS NOT NULL - sinds count() telt geen NULL-waarden.

De handleiding over count() :

Zoals je kunt zien, zijn er intern zelfs twee afzonderlijke functies. En er moet worden opgemerkt dat count(*) gaat iets sneller. Dus gebruik dat tenzij je nodig de tweede variant. Gerelateerd:

U kunt tegengaan met:
"Maar e.id is de PRIMARY KEY van core_employments , dus het is gedefinieerd NOT NULL !"

Maar dat zou voorbij gaan aan de voorwaardelijke LEFT JOIN in uw zoekopdracht die nog steeds NULL . introduceert waarden in uw NOT NULL kolom, waar niet aan de voorwaarden voor samenvoegen wordt voldaan. Gerelateerd:

Dat gezegd hebbende, LEFT [OUTER] JOIN is ook misleidend. De latere toestand

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

dwingt het om zich te gedragen als een eenvoudige [INNER] JOIN . Als je dat eenmaal hebt opgelost, kun je het net zo goed vereenvoudigen tot:

having("COUNT(*) = 1")

En als het je alleen maar uitmaakt dat tenminste er bestaat één gerelateerde rij in core_employments , vertaald naar having("COUNT(*) >= 1") , zou de superieure (duidelijkere, snellere) techniek in eenvoudige gevallen een EXISTS semi-join :

WHERE EXISTS (SELECT FROM core_employments WHERE <conditions>)



  1. Atomiciteit meerdere MySQL-subquery's in een INSERT/UPDATE-query?

  2. Hoe gebruik je order by in Laravel wanneer het CASE WHEN gebruikt?

  3. Verwijdert het verwijderen van een rij uit de weergave de rij uit de basistabel - MySQL?

  4. Kan OCI_CONNECT een ORA-01438:waarde veroorzaken die groter is dan de opgegeven precisie die is toegestaan ​​voor deze kolom?