Betrachten Sie beispielsweise die SQL-Abfrage:
SELECT
A.[Name],
ROW_NUMBER() OVER(ORDER BY A.[Name] ASC)
FROM
[FooTable] AS A
Hier beobachte ich die zurückgegebenen Ergebnisse sortiert nach A. [Name]. Wenn ich die in der Funktion ROW_NUMBER definierte Sortierspalte in eine andere Spalte ändere, werden die Ergebnisse erneut nach dieser Spalte sortiert.
Ich hatte erwartet, dass die Zeilennummer den Zeilen zugewiesen wird, aber ich hatte nicht erwartet, dass die Zeilen nach denselben Kriterien sortiert zurückkommen. Ist dies lediglich ein Nebeneffekt der Ausführung der Abfrage (in meinem Fall unter SQL Server 2008 R2) oder ist dieses Verhalten garantiert? (Ich konnte keinen Hinweis auf eine solche Garantie finden).
sql-server-2008-r2
order-by
Redcalx
quelle
quelle
Antworten:
Wenn Sie die Frage gestellt hätten, hätten Sie sie eigentlich stellen wollen:
Wir hätten Ihnen sagen können, dass Sie einen Alias für den
ROW_NUMBER()
Ausdruck erstellen und dann nach dem Alias sortieren sollen:Jetzt müssen Sie den Ausdruck nur noch an einer Stelle ändern, und die resultierende Sortierung basiert auf diesem Ausdruck, ohne ihn wiederholen zu müssen.
quelle
repeating the complex ORDER BY expression
wird nicht einmal garantiert, dass die Ausgabe in der Reihenfolge ROW_NUMBER () ausgegeben wird. Es sei denn, die Spalten in der ORDER BY-Klausel bilden einen eindeutigen Schlüssel.Absolut nicht. Beweis:
Die einzige Möglichkeit, eine Bestellung in SQL zu garantieren, besteht darin, sie anzufordern und für
ORDER BY
das Ergebnis selbst zu verwenden.quelle
Tatsächlich könnte die (alte) Frage erweitert werden, um auch die Partition nach Teilen einzuschließen , da es eine implizite Reihenfolge von zuerst der Partition nach und dann der Reihenfolge nach Teilen zu geben scheint.
Es ist also nicht ganz so einfach, wie einige vorgeschlagen haben, die Zeilennummer zuzuweisen und diese für die Bestellung zu verwenden.
Wir würden eine verschachtelte SQL benötigen, um die Partition auch durch Klausel zu extrahieren (wenn wir sie natürlich nicht einfach wiederholen wollen)
Empirisch scheinen wir implizit die letzte Ordnungszeile zu bekommen
Was uns jedoch fehlt, ist ein Beweis oder eine Garantie dafür, dass es immer gilt.
(Wenn mehrere Row_Number () -Aufrufe im Spiel sind, scheint der LETZTE die Reihenfolge anzugeben.)
BEACHTEN SIE AUCH, wenn Sie die Bestellung explizit durch den Ausführungsplan hinzufügen , wird ein letzter Sortierschritt deutlich angezeigt, und das Sortieren eines bereits sortierten Satzes ist der schlimmste Fall, daher dauert es mit der Bestellung nach wesentlich länger als ohne
quelle