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



最近我在SQL Server中使用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 

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

最新更新