SQL分页重复,按非唯一值排序
我有一张大约有500件物品的桌子。我想得到所有的项目,但在五个不同的查询(5页)。这些项目需要按非唯一字段“名称”排序。 当我尝试使用这些查询时,页面边缘有重复项:SQL分页重复,按非唯一值排序,sql,oracle,Sql,Oracle,我有一张大约有500件物品的桌子。我想得到所有的项目,但在五个不同的查询(5页)。这些项目需要按非唯一字段“名称”排序。 当我尝试使用这些查询时,页面边缘有重复项: SELECT T.* FROM ( SELECT * FROM Table ) T ORDER BY "name" OFFSET (n - 1)*100 ROWS FETCH NEXT 100 ROWS ONLY n-页码 我知道我可以为订购增加任何独特的价值,但我不想这样做) 但当我更改查询时,我的问题消失了: S
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行为?我可以使用哪种解决方案?只有当您对记录集有一致的结果集时,您才能在不重叠的情况下分页。(如果记录不重叠,您可能会很幸运,但这并不能保证它始终工作) 所以你需要订购一些独特的东西。在这种情况下,您可以按“名称”、“主键字段”排序,以获得一致的分页结果 这是一般行为,而不仅仅是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
为什么要使用派生表<代码>按“名称”偏移量从表顺序中选择*(n-1)*100行仅获取下100行fine@a_horse_with_no_name我的“name”列有重复项。我能相信ORACLE会在每个查询中以相同的方式对结果集排序吗?不,你不能。为此,您需要在订单中包含一个平局断路器。例如,主键列您能解释一下,如果我使用Oracle的ROWID而不是我自己的唯一列,这是一个正确的解决方案吗?但我使用不同表的连接数术语“主键”是指列的唯一组合。如果有多个联接表,则可以按某些唯一的组合字段进行排序