Offset 和 Fetch Next Record 发生在多页中

Offset and Fetch Next Record occurs in multiple page

最近在SQL服务器中使用offset和fetch next做分页时遇到一个问题,有些记录出现在多页中。

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

ID是主键,它出现在不同的页面,很多记录状态相同,但据我理解在数据库中的顺序应该是一样的。现在我使用 ROW_NUMBER 没有问题。

但仍然想知道 OFFSETFETCH NEXT 的任何问题,以及如何解决这个问题?

如果有多个记录状态相同,则order by status不是稳定子句;当有关系时,数据库必须决定哪条记录先出现,这可能与同一查询的连续执行不一致。

要获得稳定的结果集,您需要 order by 列的组合代表唯一键。这里,一个简单的解决方案是在子句中添加主键:

所以:

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

请注意,您不需要子查询:您可以select,在同一范围内进行排序和提取。