Расчет SQL Server ROW_NUMBER () OVER () для производной таблицы
В некоторых других базах данных (например, DB2 или Oracle сROWNUM
) Я могу опуститьORDER BY
пункт в функции ранжированияOVER()
пункт. Например:
ROW_NUMBER() OVER()
Это особенно полезно при использовании с упорядоченными производными таблицами, такими как:
SELECT t.*, ROW_NUMBER() OVER()
FROM (
SELECT ...
ORDER BY
) t
Как это можно эмулировать в SQL Server? Я нашел людей, использующихэто трюк, но это неправильно, так как он будет вести себя недетерминированно по отношению к порядку из производной таблицы:
-- 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
Конкретный пример (как видно наSQLFiddle):
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)
Кроме того, я не могу повторно использовать какое-либо выражение из производной таблицы для воспроизведенияORDER BY
в моем случае, поскольку производная таблица может быть недоступна, поскольку она может быть предоставлена некоторой внешней логикой.
Так как я могу это сделать? Могу ли я сделать это вообще?