2012-02-22 55 views
3

我需要使用分页读取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; 

可能无法可靠地工作。插入的行可以跳过,或者可能导致后续行重复,删除的行可能导致后续行被跳过。整个分页中

  1. 锁定对更新行 - 太 限制性
  2. 复制寻呼前行到一个临时表 - :

    我可以通过以下任一方式来避免此类问题太慢

  3. 通过行号和排序值的组合来选择 显示在前一页的末尾,在处恢复基于转换台合适的地方,但仍然得到 只剩下一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作为哪里恢复的标记?

+0

不幸的是,你的要求不能不自相矛盾。您的目标是要始终向人们展示他们以前从未见过的人物文章,还是要确保排名准确?如果我查看前3名,则有人将ID 8更改为33(将第6页降至第2页),但您不想在第2页上显示6,因为他们已经看到了它?如果他们再次转到第1页会怎么样? – 2012-02-22 13:28:51

+0

@AaronBertrand好的,好点。我想向用户展示他们以前从未见过的文章。那么在这种情况下你会做什么?缓存整个表格是唯一的解决方案,可以在不同页面之间提供一致的结果? – 2012-02-22 13:36:18

+0

再一次,我不清楚你的目标。您是否希望用户查看陈旧的数据,即使评级在此期间实际发生了变化?如果我正在查看eBay上的物品,并且其中一件物品的出价上涨了,我希望在出价之前将其准确地重新排序。那么你试图解决的实际问题是什么? – 2012-02-22 13:37:43

回答

3

将注释转换为答案,因为它似乎解决了用户的问题。

所以看起来你应该缓存该用户的结果(例如,你可以发送所有的ID到应用程序,并且每次只读取一次3篇文章),但是也可以添加一个免责声明,如果它他们花了半个小时滚动列表,列表可能不再准确。