Альтернатива ROW_NUMBER (), чтобы получить позицию строки? - PullRequest
0 голосов
/ 31 мая 2018

У меня динамически сгенерированный запрос с потенциально сложным предложением ORDER BY.Мне нужно извлечь номер строки в столбец для дальнейшей обработки.Вся документация, которую я смог найти, указывает на ROW_NUMBER(), но - если я что-то упустил - мне нужно переписать запрос, чтобы переместить предложение ORDER BY из этого:

SELECT ...
FROM ...
JOIN ...
WHERE ...
ORDER BY ...

... к этому:

SELECT ..., ROW_NUMBER() OVER(ORDER BY ...) AS RN
FROM ...
JOIN ...
WHERE ...

Я, конечно, могу это сделать, но это требует настройки некоторого сложного кода, который используется другими модулями, которым это не нужно.

Есть ли переменная функциикоторый просто получает позицию строки в текущем наборе результатов?

Ответы [ 3 ]

0 голосов
/ 31 мая 2018

Вы можете сделать это следующим образом:

select  *, row_number() over(order by (select null))
from    MyTable
order by Col1

ORDER BY в предложении OVER отделено от предложения ORDER BY для запроса.

order by (select null)Обходит проблему необходимости предоставить столбец для упорядочивания функции row_number ().

Если у вас есть сомнения по поводу производительности, вам следует провести некоторое тестирование для вашей ситуации и опубликовать другой вопрос, если есть проблема.

0 голосов
/ 01 июня 2018

Для записей эта точная функция, кажется, не реализована в SQL Server на момент написания, даже в последних версиях.Вам нужно использовать другие приемы, такие как ROW_NUMBER () или трюк с временными таблицами, объясненный в принятом ответе.

(например, Oracle имеет ROWNUM псевдостолбец.)

0 голосов
/ 31 мая 2018

Другой подход, который я видел у людей, заключается в следующем:

IF (OBJECT_ID('tempdb..#tempresult') IS NOT NULL)
    DROP TABLE #tempresult;
CREATE TABLE #tempresult (
    idx INT IDENTITY(1,1), 
    ...
);

INSERT #tempresult ...
SELECT ...
FROM ...
JOIN ...
WHERE ...
ORDER BY ...

idx - это то, что мы ищем.Тем не менее, не уверен, что это будет более оптимальной производительности.Зависит от ваших дел.При необходимости временную таблицу можно заменить на переменную таблицы, а также можно использовать PRIMARY KEY для idx.

Обычно я всегда выбираю ROW_NUMBER(), так как в целом это лучший вариант.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...