oracle中的分页是强制性的命令吗?

时间:2018-02-05 10:35:05

标签: sql oracle pagination

我想知道oracle中的分页。为了在sql server中进行分页,OFFSET ROWS FETCH NEXT必须order by才能进行分页。

我想知道我是否想要在oracle中分页是强制性的order by

以下是我在oracle中进行分页的方法,我开始了解:

1) OFFSET n ROWS FETCH NEXT mXT仅:    这里的排序是必须的。猜测。

2) RowNum :      有了这个,我不确定orderby是否是强制性的分页      与RowNum。

我想找出以下问题的答案,如果有人能帮我解答,我将不胜感激:

1)是否强制要求使用OFFSET n ROWS FETCH NEXT m ROWS?

2)RowNum是强制性的命令吗?

如果我有这样的选择查询:

select Id,Amount from source

3)如何使用RowNum在上面的sql查询中创建分页?

1 个答案:

答案 0 :(得分:4)

  

1)是否强制要求使用OFFSET n ROWS FETCH NEXT m ROWS?

从语法上来说,语法不是!

原因:如果您不添加ORDER BY子句,数据库可以按任何顺序返回订单。现在,如果您首先为第一页执行查询,您将以任何顺序获取它们。下次执行查询以获取下一页时,可能会返回任何其他行中的订单。

因此,您需要在ORDER BY子句上建立一个明确的行顺序(以便没有行是另一行的对等体)。在实践中,您应始终在unique子句中包含primary key / ORDER BY内容,以确保安全。 (你仍然可以在ORDER BY子句中使用非唯一 - 即使是前导列。)

e.g。

ORDER BY time_stamp DESC, id DESC

这是对每个页面执行单独查询的所有类型的分页的逻辑要求。

  

2)RowNum是强制性的命令吗?

是的,见上文。

  

3)如何使用RowNum在上面的sql查询中创建分页?

单独OFFSETROWNUM都不足以实现稳定的分页。

想一想:如果在获取第一页之后和获取第二页之前插入了新行,该怎么办?

还有另一种方法可以实现称为键集分页的稳定分页。

主要思想是不要通过告诉数据库跳过多少行并希望同时没有添加任何行来跳过“看到的行”,而是使用已经看过哪些行的唯一标识,哪些行没有。

SELECT ...
  FROM ...
 WHERE ...
   AND id < ?last_seen_id
 ORDER BY id DESC
 FETCH FIRST 10 ROWS ONLY

请记住,您需要一个ORDER BY来建立定义订单。您可以使用这些列来精确定位您之前收到数据的位置。

在我的网站上阅读有关此方法的更多信息:

http://use-the-index-luke.com/no-offset