Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Perché nessuna funzione finestrata nelle clausole where?

perché non posso utilizzare una funzione con finestra in una clausola where in SQL Server?

Una risposta, sebbene non particolarmente informativa, è perché le specifiche dicono che non puoi.

Vedi l'articolo di Itzik Ben Gan - Elaborazione logica delle query:cos'è e cosa significa per te e in particolare l'immagine qui. Le funzioni della finestra vengono valutate al momento del SELECT sul set di risultati rimanenti dopo tutto il WHERE /JOIN /GROUP BY /HAVING clausole sono state trattate (passaggio 5.1).

davvero sto cercando il motivo dietro non essere in grado di utilizzare le funzioni di windowing in dove clausole.

Il motivo per cui non sono consentiti in WHERE clausola è che creerebbe ambiguità. Rubare l'esempio di Itzik Ben Gan da T-SQL ad alte prestazioni utilizzando le funzioni della finestra (p.25)

Supponiamo che il tuo tavolo fosse

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

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

E la tua domanda

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

Quale sarebbe il risultato giusto? Ti aspetteresti che il col1 > 'B' il predicato è stato eseguito prima o dopo la numerazione delle righe?