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ć?

questionAnswers(1)

yourAnswerToTheQuestion