Np. Rozważ zapytanie SQL:
SELECT
A.[Name],
ROW_NUMBER() OVER(ORDER BY A.[Name] ASC)
FROM
[FooTable] AS A
Tutaj obserwuję zwracane wyniki posortowane według A. [Nazwa]. Jeśli zmienię kolumnę sortowania zdefiniowaną w funkcji ROW_NUMBER na inną kolumnę, wyniki zostaną posortowane według tej kolumny.
Oczekiwałem, że numer wiersza zostanie przypisany do wierszy, ale nie spodziewałem się, że wiersze wrócą posortowane według tych samych kryteriów. Czy jest to po prostu efekt uboczny wykonywania zapytania (w moim przypadku na SQL Server 2008 R2) czy to zachowanie jest gwarantowane? (Nie mogłem znaleźć odniesienia do takiej gwarancji).
sql-server-2008-r2
order-by
redcalx
źródło
źródło
Odpowiedzi:
Jeśli zadałeś pytanie, myślę, że naprawdę chciałeś zadać:
Moglibyśmy poprosić cię o utworzenie aliasu dla
ROW_NUMBER()
wyrażenia, a następnie sortowanie za pomocą aliasu:Teraz musisz zmienić wyrażenie tylko w jednym miejscu, a wynikowy sort będzie oparty na tym wyrażeniu bez konieczności jego powtarzania.
źródło
repeating the complex ORDER BY expression
nawet nie gwarantuje, że dane wyjściowe zostaną wyświetlone według kolejności ROW_NUMBER (). Chyba że kolumny w klauzuli ORDER BY tworzą unikalny klucz.Absolutnie nie. Dowód:
Jedynym sposobem na zagwarantowanie zamówienia w SQL jest poproszenie o niego, użycie go
ORDER BY
na samym wyniku.źródło
W rzeczywistości (stare) pytanie można rozszerzyć, aby obejmowało również podział według części, ponieważ wydaje się, że istnieje domyślna kolejność według najpierw podziału według, a następnie kolejności według części
Nie jest więc tak proste, jak niektórzy sugerowali, aby przypisać numer_wiersza i użyć go do zamówienia.
Potrzebowalibyśmy również zagnieżdżonego narzędzia sql do wyodrębnienia partycji według klauzuli (jeśli oczywiście nie chcemy tego po prostu powtarzać)
Wydaje się, że empirycznie otrzymujemy ostatnią linię uporządkowania pośrednio
Ale brakuje nam jakiegokolwiek dowodu lub gwarancji, że zawsze tak jest.
(Jeśli w grze występuje wiele wywołań Row_Number (), to OSTATNIE wydaje się, że wydaje polecenie)
RÓWNIEŻ UWAGA: jeśli jawnie dodasz zamówienie według planu wykonania, wyraźnie pokazuje ostatni krok sortowania, a sortowanie już posortowanego zestawu jest swego rodzaju najgorszym przypadkiem, dlatego zajmuje to znacznie dłużej w przypadku zamówienia przez niż niż bez
źródło