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
没有问题。
但仍然想知道 OFFSET
和 FETCH 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,在同一范围内进行排序和提取。
最近在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
没有问题。
但仍然想知道 OFFSET
和 FETCH 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,在同一范围内进行排序和提取。