gpt4 book ai didi

sql - 对快速变化的数据库内容进行分页

转载 作者:太空狗 更新时间:2023-10-30 01:56:41 24 4
gpt4 key购买 nike

我需要使用分页读取 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. 通过行号和排序值的组合选择显示在上一页的末尾,在根据不断变化的 table 适当的地方,但仍然得到只有接下来的 N 行

我有点喜欢第三种解决方案,但我发现当排序列中有重复值时很难实现。

例如,假设我有一个按评分降序排序的文章列表。如果评分相同,则按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 作为从哪里恢复的标记?

最佳答案

将评论转化为答案,因为它似乎已经解决了用户的问题。

因此,您似乎应该为该用户缓存结果(例如,您能否将所有 ID 发送到该应用程序,并让它在每次提取时一次只提取 3 篇文章),但还要添加一个免责声明,如果它需要他们花了半个小时来滚动列表,列表可能不再准确。

关于sql - 对快速变化的数据库内容进行分页,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9394668/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com