Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Por que não há funções em janelas em cláusulas where?


por que não posso usar uma função em janela em uma cláusula where no SQL Server?

Uma resposta, embora não seja particularmente informativa, é porque a especificação diz que você não pode.

Veja o artigo de Itzik Ben Gan - Processamento de consultas lógicas:o que é e o que significa para você e, em particular, a imagem aqui. As funções da janela são avaliadas no momento do SELECT no conjunto de resultados restante após todos os WHERE /JOIN /GROUP BY /HAVING cláusulas foram tratadas (passo 5.1).

realmente estou procurando o raciocínio por trás de não poder usar funções de janela em cláusulas where.

O motivo pelo qual eles não são permitidos no WHERE cláusula é que isso criaria ambiguidade. Roubando o exemplo de Itzik Ben Gan do T-SQL de alto desempenho usando funções de janela (p.25)

Suponha que sua mesa fosse
CREATE TABLE T1
(
col1 CHAR(1) PRIMARY KEY
)

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

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

Qual seria o resultado certo? Você esperaria que o col1 > 'B' predicado foi executado antes ou depois da numeração das linhas?