Oracle
 sql >> Base de données >  >> RDS >> Oracle

Pourquoi les fonctions d'agrégation ne sont-elles pas autorisées dans la clause where

La raison pour laquelle vous ne pouvez pas utiliser SUM() dans le WHERE clause est l'ordre d'évaluation des clauses.

FROM vous indique d'où lire les lignes. Dès que les lignes sont lues du disque à la mémoire, elles sont vérifiées pour le WHERE conditions. (En fait, dans de nombreux cas, les lignes qui échouent le WHERE clause ne sera même pas lue à partir du disque. Les "conditions" sont officiellement connues sous le nom de prédicats et certains prédicats sont utilisés - par le moteur d'exécution des requêtes - pour décider quelles lignes sont lues à partir des tables de base. Ceux-ci sont appelés accès prédicats.) Comme vous pouvez le voir, le WHERE La clause est appliquée à chaque ligne telle qu'elle est présentée au moteur.

D'autre part, l'agrégation n'est effectuée qu'après que toutes les lignes (qui vérifient tous les prédicats) ont été lues.

Pensez-y :SUM() s'applique UNIQUEMENT aux lignes qui satisfont le WHERE conditions. Si vous mettez SUM() dans le WHERE clause, vous demandez une logique circulaire. Est-ce qu'une nouvelle ligne passe le WHERE clause? Comment pourrais-je savoir? Si cela passe, je dois l'inclure dans le SUM , mais sinon, il ne doit pas être inclus dans le SUM . Alors, comment puis-je même évaluer le SUM état ?