Warum kann ich keine Fensterfunktion in einer Where-Klausel in SQL Server verwenden?
Eine Antwort, wenn auch nicht besonders informativ, lautet, weil die Spezifikation besagt, dass dies nicht möglich ist.
Siehe den Artikel von Itzik Ben Gan – Logical Query Processing:What It Is And What It Means to You und insbesondere das Bild hier. Fensterfunktionen werden zum Zeitpunkt des SELECT
ausgewertet auf der Ergebnismenge, die nach all dem WHERE
verbleibt /JOIN
/GROUP BY
/HAVING
Klauseln wurden behandelt (Schritt 5.1).
Ich suche wirklich nach dem Grund, warum Windowing-Funktionen nicht in Where-Klauseln verwendet werden können.
Der Grund, warum sie im WHERE
nicht erlaubt sind Klausel ist, dass es Mehrdeutigkeit schaffen würde. Diebstahl des Beispiels von Itzik Ben Gan aus High-Performance T-SQL Using Window Functions (p.25)
Angenommen, Ihre Tabelle wäre
CREATE TABLE T1
(
col1 CHAR(1) PRIMARY KEY
)
INSERT INTO T1 VALUES('A'),('B'),('C'),('D'),('E'),('F')
Und Ihre Anfrage
SELECT col1
FROM T1
WHERE ROW_NUMBER() OVER (ORDER BY col1) <= 3
AND col1 > 'B'
Was wäre das richtige Ergebnis? Würden Sie erwarten, dass col1 > 'B'
Prädikat lief vor oder nach der Zeilennummerierung?