Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Warum keine Fensterfunktionen in where-Klauseln?

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?