我需要使用分页来读取MS SQL数据库表的内容,即获取N行的第一页,然后是N行的第二页,依此类推。
如果在分页期间数据库的内容发生了显着变化,则会出现一个简单的分页查询,如:
SELECT *
FROM (SELECT a.*,
ROW_NUMBER() OVER (ORDER BY id) AS rnum
FROM articles a)
WHERE rnum <= 10
AND rnum >= 6;
可能无法可靠地运作。可以跳过插入的行,或者可以导致后续行重复,删除的行可能导致后续行被跳过。
我可以通过执行以下任何操作来避免此类问题:
我有点像第三种解决方案,但是当排序列中存在重复值时,我发现很难实现。
例如,假设我有一个按降序排序的文章列表。如果评级相同,则按升序ID排序(ID是唯一的):
ID RATING
9 34
3 32
6 32
8 32
12 32
1 25
2 23
现在,我想要3篇文章的页面,这意味着第一页将有第9,3和6条。这是通过查询排序列表中的前3篇文章来完成的。
现在,我想从第8条继续接下来的3篇文章,使用文章ID作为恢复位置的标记。
如果我告诉数据库采取第8条的声誉,而不是采取声誉低于此的3篇文章,我会跳过第12条。
如果我告诉数据库取得第8条的声誉,而不是取3声名称低于或等于的声明,我会重复第3条和第6条。
我可以使用哪种SQL查询(或查询组合)来恢复第8条的分页,使用文章ID作为恢复位置的标记?
答案 0 :(得分:3)
将评论转换为答案,因为它似乎解决了用户的问题。
因此,您似乎应该为该用户缓存结果(例如,您是否可以将所有ID发送到应用程序并让它在每次获取时一次只提取3篇文章),但也添加免责声明,如果需要他们半小时滚动列表,列表可能不再准确。