Oracle
 sql >> Database >  >> RDS >> Oracle

Perché le funzioni aggregate non sono consentite nella clausola where

Il motivo per cui non puoi utilizzare SUM() nel WHERE clausola è l'ordine di valutazione delle clausole.

FROM ti dice da dove leggere le righe. Non appena le righe vengono lette dal disco alla memoria, viene verificata la presenza di WHERE condizioni. (In realtà in molti casi righe che non superano il WHERE la clausola non verrà nemmeno letta dal disco. Le "condizioni" sono formalmente note come predicati e alcuni predicati vengono utilizzati - dal motore di esecuzione delle query - per decidere quali righe vengono lette dalle tabelle di base. Questi sono chiamati accesso predicati.) Come puoi vedere, il WHERE La clausola viene applicata a ciascuna riga così come viene presentata al motore.

D'altra parte, l'aggregazione viene eseguita solo dopo che tutte le righe (che verificano tutti i predicati) sono state lette.

Pensa a questo:SUM() si applica SOLO alle righe che soddisfano il WHERE condizioni. Se metti SUM() nel WHERE clausola, lei chiede la logica circolare. Una nuova riga supera il WHERE clausola? Come potrei saperlo? Se passerà, devo includerlo nel SUM , ma in caso contrario non dovrebbe essere incluso nel SUM . Quindi, come posso anche valutare il SUM condizione?