Мне нужно прочитать содержимое таблицы базы данных MS SQL, используя нумерацию страниц, то есть выборку первой страницы из N строк, затем второй страницы из N строк и т. Д.
Если содержимое базы данныхзначительно изменяется во время нумерации страниц, простой запрос нумерации страниц, такой как:
SELECT *
FROM (SELECT a.*,
ROW_NUMBER() OVER (ORDER BY id) AS rnum
FROM articles a)
WHERE rnum <= 10
AND rnum >= 6;
, может работать ненадежно.Вставленные строки могут быть пропущены или могут вызвать повторение последующих строк, а удаленные строки могут привести к пропуску последующих строк.
Я мог бы избежать таких проблем, выполнив любое из следующих действий:
- Блокировка строк от обновления во время всей нумерации страниц - слишком ограничительный
- Копирование строк во временную таблицу перед разбиением на страницы - слишком медленный
- Выбратьпо комбинации номера строки и отсортированного значения, которое отображалось в конце предыдущей страницы, возобновляется в соответствующем месте на основе изменяющейся таблицы, но все еще получает только следующие N строк
Iвроде как 3-е решение, но мне трудно реализовать, когда в столбцах сортировки есть повторяющиеся значения.
Например, предположим, у меня есть список статей, отсортированных по убыванию рейтинга.Если рейтинг одинаковый, они сортируются по возрастанию идентификатора (идентификаторы уникальны):
ID RATING
9 34
3 32
6 32
8 32
12 32
1 25
2 23
Теперь я хочу страницы из 3 статей, что означает, что на первой странице будут статьи 9, 3 и6. Это делается путем запроса трех лучших статей из отсортированного списка.
Теперь я хочу взять следующие 3 статьи, начиная со статьи 8, используя идентификатор статьи в качестве маркера для того, где возобновить.
Если бы я сказал базе данных взять репутацию статьи 8, а затем взять 3 статьи, репутация которых ниже этой, я пропустил бы статью 12.
Если бы я сказал базе данных взять репутациюстатьи 8 и, если взять 3 статьи, репутация которых ниже или равна этому, я бы повторил статьи 3 и 6.
Какой SQL-запрос (или комбинацию запросов) можно использовать для возобновления нумерации страницстатья 8, с использованием идентификатора статьи в качестве маркера для возобновления?