首页 > 解决方案 > 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 行为以及我可以使用哪种解决方案?

标签: sqloracle

解决方案


只有当您有一致的记录集结果集时,您才能在不重叠的情况下进行分页。(如果记录不重叠,您可能会很幸运,但不能保证它会一直工作)

所以你需要订购一些独特的东西。在这种情况下,您可以按“名称”、“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


推荐阅读