sql >> Database teknologi >  >> RDS >> PostgreSQL

Jeg har forskellige resultater fra forespørgsel for COUNT('e.id') eller COUNT(e.id)

'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.

Manualen om count() :

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>)



  1. php display multilevel treenode menu

  2. Hvordan bruger jeg mysql source-kommandoen med en mysql-variabel?

  3. Sådan gemmer du kun tid; ikke dato og tid?

  4. Hvordan låser jeg på en InnoDB-række, der ikke eksisterer endnu?