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

Berechnen von SQL Server ROW_NUMBER() OVER() für eine abgeleitete Tabelle

Die Row_Number() OVER (ORDER BY (SELECT 1)) Trick sollte NICHT als Möglichkeit gesehen werden, die Reihenfolge der zugrunde liegenden Daten nicht zu ändern. Es ist nur ein Mittel, um zu vermeiden, dass der Server eine zusätzliche und unnötige Sortierung durchführt (er führt die Sortierung möglicherweise immer noch durch, kostet aber im Vergleich zur Sortierung nach einer Spalte den geringstmöglichen Betrag).

Alle Abfragen im SQL-Server UNBEDINGT einen ORDER BY haben -Klausel in der äußersten Abfrage, damit die Ergebnisse auf garantierte Weise zuverlässig geordnet werden.

Das Konzept der "Beibehaltung der ursprünglichen Ordnung" existiert in relationalen Datenbanken nicht. Tabellen und Abfragen müssen immer als unsortiert betrachtet werden, bis ORDER BY -Klausel wird in der äußersten Abfrage angegeben.

Sie könnten dieselbe ungeordnete Abfrage 100.000 Mal versuchen und sie immer mit derselben Reihenfolge erhalten, und so glauben, dass Sie sich auf diese Reihenfolge verlassen können. Aber das wäre ein Fehler, denn eines Tages wird sich etwas ändern und es wird nicht die Reihenfolge haben, die Sie erwarten. Ein Beispiel ist, wenn eine Datenbank auf eine neue Version von SQL Server aktualisiert wird – dies hat dazu geführt, dass viele Abfragen ihre Reihenfolge geändert haben. Aber es muss keine so große Veränderung sein. So wenig wie das Hinzufügen oder Entfernen eines Indexes kann zu Unterschieden führen. Und mehr:Installieren eines Service Packs. Partitionieren einer Tabelle. Erstellen einer indizierten Ansicht, die die betreffende Tabelle enthält. Erreichen eines Wendepunkts, an dem ein Scan statt einer Suche gewählt wird. Und so weiter.

Verlassen Sie sich nicht darauf, dass die Ergebnisse sortiert werden, es sei denn, Sie haben "Server, ORDER BY" gesagt ".