Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL分页重复,按非唯一值排序_Sql_Oracle - Fatal编程技术网

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

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

我有一张大约有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行为?我可以使用哪种解决方案?

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

所以你需要订购一些独特的东西。在这种情况下,您可以按“名称”、“主键字段”排序,以获得一致的分页结果

这是一般行为,而不仅仅是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而不是我自己的唯一列,这是一个正确的解决方案吗?但我使用不同表的连接数术语“主键”是指列的唯一组合。如果有多个联接表,则可以按某些唯一的组合字段进行排序