sql >> Database >  >> RDS >> Sqlserver

Waarom geen vensterfuncties in waar-clausules?

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

. was
CREATE 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?



  1. Hoe Sin() werkt in PostgreSQL

  2. Waarschuwing:mysqli_connect():(HY000/2002):Geen dergelijk bestand of map

  3. COVID-19-paraatheid bij ScaleGrid

  4. Hoe maak je een hoofdletterongevoelige query in Postgresql?