偏移和获取下一条记录在多页中发生

问题描述

最近我在sql Server中使用offset和fetch进行分页时遇到了一个问题,某些记录出现在多页中。

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 

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