hvorfor kan jeg ikke bruge en vinduesfunktion i en where-klausul i SQL Server?
Et svar, selvom det ikke er særlig informativt, er fordi specifikationerne siger, at du ikke kan.
Se artiklen af Itzik Ben Gan - Logical Query Processing:What It Is And What It Means to You og især billedet her. Vinduesfunktioner evalueres på tidspunktet for SELECT
på resultatsættet, der er tilbage efter alle WHERE
/JOIN
/GROUP BY
/HAVING
klausuler er blevet behandlet (trin 5.1).
Jeg leder virkelig efter begrundelsen for ikke at kunne bruge vinduesfunktioner i where-klausuler.
Årsagen til, at de ikke er tilladt i WHERE
klausulen er, at det ville skabe uklarhed. Stjæler Itzik Ben Gans eksempel fra højtydende T-SQL ved hjælp af vinduesfunktioner (s.25)
Antag, at dit bord var
CREATE TABLE T1
(
col1 CHAR(1) PRIMARY KEY
)
INSERT INTO T1 VALUES('A'),('B'),('C'),('D'),('E'),('F')
Og din forespørgsel
SELECT col1
FROM T1
WHERE ROW_NUMBER() OVER (ORDER BY col1) <= 3
AND col1 > 'B'
Hvad ville være det rigtige resultat? Ville du forvente, at col1 > 'B'
prædikat kørte før eller efter rækkenummereringen?