sql - SQL分页重复,按非唯一值排序
问题描述
我有一张大约有 500 件物品的桌子。我想在五个不同的查询(5 页)中获取所有项目。这些项目将需要按非唯一字段“名称”排序。当我尝试使用这些查询时,我在页面边缘有重复项:
SELECT T.*
FROM (
SELECT *
FROM Table
) T
ORDER BY "name"
OFFSET (n - 1)*100 ROWS
FETCH NEXT 100 ROWS ONLY
n——页码。
我知道我可以为订购添加任何独特的价值,但我不想这样做)
但是当我更改查询时,我的问题就消失了:
SELECT T.*
FROM (
SELECT *
FROM Table
ORDER BY "name"
) T
OFFSET (n - 1)*100 ROWS
FETCH NEXT 100 ROWS ONLY
为什么我得到了这样的 ORACLE 行为以及我可以使用哪种解决方案?
解决方案
只有当您有一致的记录集结果集时,您才能在不重叠的情况下进行分页。(如果记录不重叠,您可能会很幸运,但不能保证它会一直工作)
所以你需要订购一些独特的东西。在这种情况下,您可以按“名称”、“primary_key_fields”排序以实现一致的分页结果
这是一般行为,而不仅仅是关于 ORACLE 数据库。
请参阅 dbfiddle 中的示例。在第一个查询中,我使用 offset=1 行并仅获取 10 行并仅按名称排序。我有 10 条记录
select *
from t
order by name offset 1 rows fetch next 10 rows only
在第二个查询中,我使用 offset=11 行并仅获取 10 行。我得到相同的 10 条不应该重叠的记录
select *
from t
order by name offset 11 rows fetch next 10 rows only
现在,如果要按名称和“主键”使用顺序,我不会得到任何重叠
select *
from t
order by name,x offset 1 rows fetch next 10 rows only
select *
from t
order by name,x offset 11 rows fetch next 10 rows only
https://dbfiddle.uk/?rdbms=oracle_18&fiddle=dc18bcfa3a73b177114b5e93979f2a44
推荐阅读
- azure-logic-apps - Azure Logic App - 将 csv 文件导入 Azure 中的 sql server 表
- php - 循环中的 cURL 请求有时根本不返回任何内容
- reactjs - 如何在 github 上正确发布我的 react 应用程序?
- heroku - 浏览器中未设置会话 cookie
- javascript - 倒计时问题
- amazon-ec2 - 我的 ec2 实例中的 Tomcat 无法正常关闭或启动
- mysql - 将布尔值设置为 mysql 记录指示在选择的时间戳范围之前是否存在其他记录
- node.js - 如何存储基于时间戳升序的记录?
- jquery - 一些 Font Awesome 图标显示,一些不显示
- sql-server - 按最早日期订购位置,不返回每个日期戳的记录