Obliczanie SQL Server ROW_NUMBER () OVER () dla tabeli pochodnej
W niektórych innych bazach danych (np. DB2 lub Oracle zROWNUM
), Mogę pominąćORDER BY
klauzula w funkcji rankinguOVER()
klauzula. Na przykład:
ROW_NUMBER() OVER()
Jest to szczególnie przydatne w przypadku użycia z uporządkowanymi tabelami pochodnymi, takimi jak:
SELECT t.*, ROW_NUMBER() OVER()
FROM (
SELECT ...
ORDER BY
) t
Jak można to emulować w SQL Server? Znalazłem ludzi używającychto sztuczka, ale to nie tak, ponieważ będzie zachowywać się nie deterministycznie w odniesieniu do kolejności w tabeli pochodnej:
-- This order here ---------------------vvvvvvvv
SELECT t.*, ROW_NUMBER() OVER(ORDER BY (SELECT 1))
FROM (
SELECT TOP 100 PERCENT ...
-- vvvvv ----redefines this order here
ORDER BY
) t
Konkretny przykład (jak widać naSQLFiddle):
SELECT v, ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) RN
FROM (
SELECT TOP 100 PERCENT 1 UNION ALL
SELECT TOP 100 PERCENT 2 UNION ALL
SELECT TOP 100 PERCENT 3 UNION ALL
SELECT TOP 100 PERCENT 4
-- This descending order is not maintained in the outer query
ORDER BY 1 DESC
) t(v)
Ponadto nie mogę ponownie użyć żadnego wyrażenia z tabeli pochodnej do odtworzeniaORDER BY
klauzula w moim przypadku, ponieważ pochodna tabela może nie być dostępna, ponieważ może być dostarczona przez jakąś zewnętrzną logikę.
Więc jak mogę to zrobić? Czy mogę to w ogóle zrobić?