Смещение и выборка следующей записи происходят на нескольких страницах

#sql #sql-server #subquery #sql-order-by #sql-limit

#sql #sql-сервер #подзапрос #sql-порядок-по #sql-limit #sql-order-by

Вопрос:

Недавно я столкнулся с проблемой, когда при использовании смещения и выборки next для разбиения на страницы в SQL Server некоторые записи отображаются на нескольких страницах.

 SELECT A.ID, A.Col1, A.Col2, A.Status
FROM (
    SELECT ID, Col1, Col2, Status
    FROM Table1
    ORDER BY Status
    OFFSET 100 ROWS FETCH NEXT 100 ROWS ONLY --# 100 just for sample, first page will be 0 and 100
) AS A
ORDER BY A.Status
  

ИДЕНТИФИКАТОР является первичным ключом, и он встречается на другой странице, много записей с одинаковым статусом, но последовательность в базе данных должна быть одинаковой, насколько я понимаю. Теперь я использую ROW_NUMBER без проблем.

Но все же хотите узнать о любой проблеме с OFFSET и FETCH NEXT , и как это исправить?

Ответ №1:

Если имеется несколько записей с одинаковым статусом, то order by status это не является стабильным предложением; при наличии связей база данных должна решить, какая запись идет первой, и это может быть не согласовано при последовательном выполнении одного и того же запроса.

Чтобы получить стабильный результирующий набор, вам нужны order by столбцы, комбинация которых представляет уникальный ключ. Здесь простым решением является добавление первичного ключа в предложение:

Итак:

 SELECT ID, Col1, Col2, Status
FROM Table1
ORDER BY Status, ID
OFFSET 100 ROWS FETCH NEXT 100 ROWS ONLY 
  

Обратите внимание, что вам не нужен подзапрос: вы можете выбирать, сортировать и извлекать в одной области.

Комментарии:

1. Да, для подзапроса нет необходимости, хорошо, я добавлю еще один столбец для сортировки. Спасибо.