sql >> Base de Datos >  >> RDS >> Sqlserver

¿Por qué no hay funciones de ventana en las cláusulas where?

¿Por qué no puedo usar una función de ventana en una cláusula where en SQL Server?

Una respuesta, aunque no particularmente informativa, es porque la especificación dice que no se puede.

Consulte el artículo de Itzik Ben Gan - Procesamiento lógico de consultas:qué es y qué significa para usted y, en particular, la imagen aquí. Las funciones de ventana se evalúan en el momento de SELECT en el conjunto de resultados restante después de todos los WHERE /JOIN /GROUP BY /HAVING se han tratado las cláusulas (paso 5.1).

realmente estoy buscando el razonamiento detrás de no poder usar funciones de ventana en cláusulas where.

La razón por la que no están permitidos en WHERE cláusula es que crearía ambigüedad. Robar el ejemplo de Itzik Ben Gan de T-SQL de alto rendimiento mediante funciones de ventana (p.25)

Supongamos que su mesa fuera

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

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

Y tu consulta

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

¿Cuál sería el resultado correcto? ¿Esperaría que col1 > 'B' ¿El predicado se ejecutó antes o después de la numeración de filas?