sql >> Databasteknik >  >> RDS >> Oracle

Varför är aggregerade funktioner inte tillåtna i where-satsen

Anledningen till att du inte kan använda SUM() i WHERE klausul är ordningen för utvärdering av klausuler.

FROM talar om var du ska läsa rader ifrån. Precis när rader läses från disk till minne, kontrolleras de för WHERE betingelser. (Faktiskt i många fall rader som misslyckas med WHERE klausul kommer inte ens att läsas från disk. "Villkor" är formellt kända som predikat och några predikat används - av sökmotorn - för att bestämma vilka rader som ska läsas från bastabellerna. Dessa kallas åtkomst predikat.) Som du kan se är WHERE klausul tillämpas på varje rad när den presenteras för motorn.

Å andra sidan görs aggregering först efter att alla rader (som verifierar alla predikaten) har lästs.

Tänk på det här:SUM() gäller ENDAST för de rader som uppfyller WHERE betingelser. Om du sätter SUM() i WHERE klausul, du ber om cirkulär logik. Passar en ny rad WHERE klausul? Hur skulle jag kunna veta? Om det går igenom måste jag inkludera det i SUM , men om inte, bör det inte inkluderas i SUM . Så hur utvärderar jag ens SUM skick?



  1. Behöver jag skapa index på främmande nycklar på Oracle?

  2. Hantera PostgreSQL High Availability – Del I:PostgreSQL Automatic Failover

  3. Välj n slumpmässiga rader från SQL Server-tabellen

  4. Viktig PostgreSQL-övervakning - Del 2