[英]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.