sql >> Database >  >> RDS >> Sqlserver

Berekening van SQL Server ROW_NUMBER() OVER() voor een afgeleide tabel

De Row_Number() OVER (ORDER BY (SELECT 1)) truc mag NIET worden gezien als een manier om te voorkomen dat de volgorde van de onderliggende gegevens verandert. Het is alleen een manier om te voorkomen dat de server een extra en onnodige sortering uitvoert (het kan nog steeds de sortering uitvoeren, maar het kost het minimaal mogelijke bedrag in vergelijking met sorteren op een kolom).

Alle zoekopdrachten in SQL-server ABSOLUUT MOETEN een ORDER BY . hebben clausule in de buitenste zoekopdracht om de resultaten op een betrouwbare manier op een gegarandeerde manier te ordenen.

Het concept van "de oorspronkelijke volgorde behouden" bestaat niet in relationele databases. Tabellen en zoekopdrachten moeten altijd als ongeordend worden beschouwd totdat en tenzij een ORDER BY clausule is gespecificeerd in de buitenste query.

Je zou dezelfde ongeordende vraag 100.000 keer kunnen proberen en het altijd met dezelfde bestelling ontvangen, en zo gaan geloven dat je op die bestelling kunt vertrouwen. Maar dat zou een vergissing zijn, want op een dag verandert er iets en heeft het niet de volgorde die je verwacht. Een voorbeeld is wanneer een database wordt geüpgraded naar een nieuwe versie van SQL Server - dit heeft ertoe geleid dat veel query's de volgorde hebben gewijzigd. Maar het hoeft niet zo'n grote verandering te zijn. Iets zo klein als het toevoegen of verwijderen van een index kan verschillen veroorzaken. En meer:​​een servicepack installeren. Een tafel partitioneren. Een geïndexeerde weergave maken die de betreffende tabel bevat. Het bereiken van een kantelpunt waar een scan wordt gekozen in plaats van een zoeken. En zo verder.

Vertrouw niet op resultaten die moeten worden besteld, tenzij u hebt gezegd "Server, ORDER BY ".




  1. Externe sleutel van serieel type - zorg ervoor dat deze altijd handmatig wordt ingevuld

  2. Krijg een lijst met datums tussen twee datums met behulp van een functie

  3. RMAN-opdrachten mislukken met ORA-00904:"BS". "GUID":ongeldige identifier

  4. mysql case in update statement met REPLACE