繁体   English   中英

SQL分页重复,按非唯一值排序

[英]SQL pagination duplicates with ordering by non-unique value

我有一张约有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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM