我需要使用分页读取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;
可能无法可靠地工作。插入的行可以跳过,或者可能导致后续行重复,删除的行可能导致后续行被跳过。整个分页中
- 锁定对更新行 - 太 限制性
- 复制寻呼前行到一个临时表 - :
我可以通过以下任一方式来避免此类问题太慢
- 通过行号和排序值的组合来选择 显示在前一页的末尾,在处恢复基于转换台合适的地方,但仍然得到 只剩下一N行
我有点像第三解决方案,但我发现很难当有排序列(重复值实现小号)。
例如,假设我有按降序排列的文章列表。如果等级相同,它们是按升序编号排序(该ID是唯一的):
ID RATING
9 34
3 32
6 32
8 32
12 32
1 25
2 23
现在,我想3篇文章,这意味着在第一页就会有第9条,第3和第6页。这是通过查询排序列表中排名前三位的文章完成的。
现在,我想从第8条中继续接下来的3篇文章,使用文章ID作为标记恢复的位置。
如果我告诉数据库采取第8条的声誉和比拿3篇具有声誉低于,我将跳过第12条
如果我告诉数据库作为文章的声誉8并且比3个声誉低于或等于此的文章,我会重复第3条和第6条。
可以使用什么SQL查询(或查询组合)来恢复第8条的分页,使用文章ID作为哪里恢复的标记?
不幸的是,你的要求不能不自相矛盾。您的目标是要始终向人们展示他们以前从未见过的人物文章,还是要确保排名准确?如果我查看前3名,则有人将ID 8更改为33(将第6页降至第2页),但您不想在第2页上显示6,因为他们已经看到了它?如果他们再次转到第1页会怎么样? – 2012-02-22 13:28:51
@AaronBertrand好的,好点。我想向用户展示他们以前从未见过的文章。那么在这种情况下你会做什么?缓存整个表格是唯一的解决方案,可以在不同页面之间提供一致的结果? – 2012-02-22 13:36:18
再一次,我不清楚你的目标。您是否希望用户查看陈旧的数据,即使评级在此期间实际发生了变化?如果我正在查看eBay上的物品,并且其中一件物品的出价上涨了,我希望在出价之前将其准确地重新排序。那么你试图解决的实际问题是什么? – 2012-02-22 13:37:43