Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Warum sind Aggregatfunktionen in der Where-Klausel nicht zulässig

Der Grund, warum Sie SUM() nicht verwenden können im WHERE Klausel ist die Reihenfolge der Auswertung von Klauseln.

FROM sagt Ihnen, wo Sie Zeilen lesen müssen. Sobald Zeilen von der Festplatte in den Speicher gelesen werden, werden sie auf das WHERE überprüft Bedingungen. (Eigentlich in vielen Fällen Zeilen, die den WHERE nicht erfüllen Klausel wird nicht einmal von der Festplatte gelesen. "Bedingungen" sind formal als Prädikate bekannt und einige Prädikate werden von der Abfrageausführungsmaschine verwendet, um zu entscheiden, welche Zeilen aus den Basistabellen gelesen werden. Diese werden Zugriff genannt Prädikate.) Wie Sie sehen können, ist WHERE -Klausel wird auf jede Zeile angewendet, wenn sie der Engine präsentiert wird.

Andererseits erfolgt die Aggregation erst, nachdem alle Zeilen (die alle Prädikate verifizieren) gelesen wurden.

Denken Sie darüber nach:SUM() gilt NUR für die Zeilen, die WHERE erfüllen Bedingungen. Wenn Sie SUM() eingeben im WHERE Klausel, fragen Sie nach zirkulärer Logik. Übergibt eine neue Zeile das WHERE Klausel? Woher soll ich das wissen? Wenn es besteht, muss ich es in die SUM aufnehmen , aber wenn nicht, sollte es nicht in SUM aufgenommen werden . Wie werte ich also überhaupt die SUM aus Bedingung?