В некоторых других базах данных (например, 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
в моем случае, поскольку производная таблица может быть недоступна, поскольку она может быть предоставлена некоторой внешней логикой.
Итак, как я могу это сделать? Могу ли я вообще это сделать?