sql >> Databasteknik >  >> RDS >> PostgreSQL

Jag har olika resultat från frågan för COUNT('e.id') eller COUNT(e.id)

'e.id' är en strängkonstant, så COUNT('e.id') är bara ett besvärligt, missvisande sätt att säga COUNT(*) .

COUNT(e.id) , å andra sidan, räknar alla rader i resultatet där e.id IS NOT NULL - sedan count() räknar inte NULL-värden.

Handboken om count() :

Som du kan se finns det till och med två separata funktioner internt. Och det bör noteras att count(*) är något snabbare. Så använd det om du inte behöver den andra varianten. Relaterat:

Du kan kontra med:
"Men e.id är PRIMARY KEY av core_employments , så det är definierat NOT NULL !"

Men det skulle förbise den villkorliga LEFT JOIN i din fråga som fortfarande introducerar NULL värden i din NOT NULL kolumn, där anslutningsvillkoren inte är uppfyllda. Relaterat:

Som sagt, LEFT [OUTER] JOIN är också vilseledande. Det senare villkoret

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

tvingar den att fungera som en vanlig [INNER] JOIN . När du har fixat det kan du lika gärna förenkla till:

having("COUNT(*) = 1")

Och om allt du bryr dig är att åtminstone en relaterad rad finns i core_employments , översatt till having("COUNT(*) >= 1") , skulle den överlägsna (tydligare, snabbare) tekniken i enkla fall vara en EXISTS semi-join :

WHERE EXISTS (SELECT FROM core_employments WHERE <conditions>)



  1. Hitta alla frågor som använder en viss tabell

  2. MySQL Trigger - Lagra en SELECT i en variabel

  3. Varför tar en fråga med IN (underfråga) längre tid än en fråga med IN (diskret lista)

  4. mysql räkna ord i sql syntax