我想了解预言机中的分页。为了在sql server
进行分页,有一些OFFSET ROWS FETCH NEXT
必须order by
才能进行分页。
我试图弄清楚我是否想在oracle 中进行分页order by
强制性的。
以下是我所了解的在 oracle 中进行分页的方法:
1)偏移 N 行仅获取接下来的 M 行: 排序方式是强制性的,这里是猜测。
2)行数: 有了这个,我不确定排序是否是分页的强制性 与罗纳姆。
我正在尝试找出以下问题的答案,如果有人可以帮助我回答,我将不胜感激:
1) 是否强制排序,偏移量 N 行仅获取接下来的 m 行?
2) RowNum 是否强制订购?
如果我有这样的选择查询:
select Id,Amount from source
3) 如何使用 RowNum 在上面的 sql 查询中创建分页?
> 1) 是否强制排序,偏移 N 行仅获取接下来的 m 行?
语法上不是,语义上是!
原因:如果不添加ORDER BY
子句,数据库可能会以任意顺序返回订单。现在,如果您首先对第一页执行查询,您将按任意顺序获取它们。下次执行查询以获取下一页时,可能会返回任何其他行中的订单。
因此,您需要ORDER BY
子句来建立明确的行顺序(以便没有一行与另一行对等)。在实践中,为了安全起见,您应该始终在ORDER BY
条款中包含unique
/primary key
的内容。(您仍然可以在ORDER BY
子句中使用非唯一 — 即使作为前导列)。
例如
ORDER BY time_stamp DESC, id DESC
对于为每个页面执行单独查询的所有类型的分页,这是逻辑要求。
2) RowNum 是否强制订购?
是的,见上文。
3) 如何使用 RowNum 在上面的 sql 查询中创建分页?
无论是OFFSET
还是ROWNUM
都不足以实现稳定的分页。
想一想:如果在您获取第一页之后和第二页之前插入新行怎么办?
还有另一种实现稳定分页的方法,称为键集分页。
主要思想不是通过告诉数据库要跳过多少行并希望同时不添加行来跳过"看到的行",而是使用唯一标识哪些行已经看到,哪些没有
。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