Как стать автором
Обновить

Аналог LIMIT в MSSQL

Чулан
Так уж сложилось что MSSQL не имеет своего аналога функции LIMIT в MySQL (за исключением TOP). Но достаточно часто возникает необходимость выбрать определенный интервал значений не с первого а например с 1000-го.


Существует несколько возможных вариантов:

1. Выбираем значения от первого и до последнего нужного, передаем их в скрипт и уже там обрезаем при выводе те что нам не нужны .

SELECT TOP n * FROM TABLE ORDER BY id
n — номер последнего элемента
id — уникальный идентификатор

При роботе с большими таблицами очень долго исполняется, годится только для маленьких таблиц

2. Делаем выборку с условием не вхождения по признаку

SELECT TOP n id,* FROM TABLE
WHERE id not in (SELECT TOP (n - m) id FROM TABLE)
ORDER BY id

n — номер последнего элемента
m — необходимое количество элементов
id — уникальный идентификатор

Работает в некоторых случаях немного быстрее первого метода и годится для обработки достаточно больших таблиц при условии не сложного запроса

3. Наконец последний способ с использованием row_number(), наиболее быстро работающий практически с любыми таблицами

WITH num_row
AS
(
SELECT row_number() OVER (ORDER BY id) as nom , *
FROM TABLE
)
SELECT * FROM num_row
WHERE nom BETWEEN (n - m) AND n

n — номер последнего элемента
m — необходимое количество элементов
id — уникальный идентификатор

Вчера был замечен небольшой парадокс выборка способом 3 работала гораздо быстрее чем просто SELECT TOP n с той-же таблицы (в которой больше 60млн. строк).

P.S. Это мой первый топик на хабре, прошу не судить строго.
Теги:
Хабы:
Всего голосов 15: ↑13 и ↓2 +11
Просмотры 20K
Комментарии Комментарии 6