waarom kan ik geen vensterfunctie gebruiken in een waar-clausule in SQL Server?
Een antwoord, hoewel niet bijzonder informatief, is omdat de specificatie zegt dat je dat niet kunt.
Zie het artikel van Itzik Ben Gan - Logische queryverwerking:wat het is en wat het voor u betekent en in het bijzonder de afbeelding hier. Vensterfuncties worden geëvalueerd op het moment van de SELECT
op de resultatenset die overblijft na alle WHERE
/JOIN
/GROUP BY
/HAVING
clausules zijn behandeld (stap 5.1).
echt, ik ben op zoek naar de redenering achter het niet kunnen gebruiken van vensterfuncties in waar-clausules.
De reden dat ze niet zijn toegestaan in de WHERE
clausule is dat het dubbelzinnigheid zou creëren. Itzik Ben Gans voorbeeld stelen uit High-Performance T-SQL met behulp van vensterfuncties (p.25)
Stel dat uw tafel
. wasCREATE TABLE T1
(
col1 CHAR(1) PRIMARY KEY
)
INSERT INTO T1 VALUES('A'),('B'),('C'),('D'),('E'),('F')
En uw vraag
SELECT col1
FROM T1
WHERE ROW_NUMBER() OVER (ORDER BY col1) <= 3
AND col1 > 'B'
Wat zou het juiste resultaat zijn? Zou je verwachten dat de col1 > 'B'
predikaat liep voor of na de rijnummering?