'e.id'
er en strengkonstant, så COUNT('e.id')
er bare en akavet, vildledende måde at sige COUNT(*)
på .
COUNT(e.id)
tæller på den anden side alle rækker i resultatet, hvor e.id IS NOT NULL
- siden count()
tæller ikke NULL-værdier.
Som du kan se, er der endda to separate funktioner internt. Og det skal bemærkes, at count(*)
er lidt hurtigere. Så brug det, medmindre du bruger den anden variant. Relateret:
Du kan imødegå med:
"Men e.id
er den PRIMARY KEY
af core_employments
, så det er defineret NOT NULL
!"
Men det ville overse den betingede LEFT JOIN
i din forespørgsel, der stadig introducerer NULL
værdier i din NOT NULL
kolonne, hvor sammenføjningsbetingelserne ikke er opfyldt. Relateret:
Når det er sagt, LEFT [OUTER] JOIN
er også vildledende. Den senere betingelse
having("COUNT(e.id) = 1")
tvinger den til at fungere som en almindelig [INNER] JOIN
. Når du har rettet det, kan du lige så godt forenkle til:
having("COUNT(*) = 1")
Og hvis du bare bekymrer dig mindst en relateret række findes i core_employments
, oversat til having("COUNT(*) >= 1")
, ville den overlegne (klare, hurtigere) teknik i simple tilfælde være en EXISTS
semi-join
:
WHERE EXISTS (SELECT FROM core_employments WHERE <conditions>)