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

Pourquoi pas de fonctions fenêtrées dans les clauses where ?

pourquoi ne puis-je pas utiliser une fonction fenêtrée dans une clause where dans SQL Server ?

Une réponse, bien que pas particulièrement informative, est que la spécification indique que vous ne pouvez pas.

Voir l'article d'Itzik Ben Gan - Logical Query Processing:What It Is And What It Means to You et en particulier l'image ici. Les fonctions de la fenêtre sont évaluées au moment du SELECT sur le jeu de résultats restant après tous les WHERE /JOIN /GROUP BY /HAVING les clauses ont été traitées (étape 5.1).

vraiment, je cherche le raisonnement derrière l'impossibilité d'utiliser les fonctions de fenêtrage dans les clauses where.

La raison pour laquelle ils ne sont pas autorisés dans WHERE clause est qu'elle créerait une ambiguïté. Voler l'exemple d'Itzik Ben Gan à partir de T-SQL haute performance à l'aide des fonctions de fenêtre (p.25)

Supposons que votre table était

CREATE TABLE T1
(
col1 CHAR(1) PRIMARY KEY
)

INSERT INTO T1 VALUES('A'),('B'),('C'),('D'),('E'),('F')

Et votre requête

SELECT col1
FROM T1
WHERE ROW_NUMBER() OVER (ORDER BY col1) <= 3
AND col1 > 'B'

Quel serait le bon résultat ? Vous attendriez-vous à ce que le col1 > 'B' prédicat exécuté avant ou après la numérotation des lignes ?