Oracle 中分页的 LIMIT 和 OFFSET 的替代方案
我正在开发一个网络应用程序,需要对有序结果进行分页。我通常使用 LIMIT/OFFSET 来达到此目的。
在 Oracle 中对有序结果进行分页的最佳方式是什么?我见过一些使用 rownum 和子查询的示例。是这样吗?您能给我一个将此 SQL 转换为 Oracle 的示例吗:(
SELECT fieldA,fieldB
FROM table
ORDER BY fieldA
OFFSET 5 LIMIT 14
我正在使用 Oracle 10g,因为它的价值)
谢谢!
答案: 使用 karim79 提供的以下链接,此 SQL 将如下所示:
SELECT * FROM (
SELECT rownum rnum, a.*
FROM(
SELECT fieldA,fieldB
FROM table
ORDER BY fieldA
) a
WHERE rownum <=5+14
)
WHERE rnum >=5
I'm developing a web application and need to page ordered results. I normaly use LIMIT/OFFSET for this purpose.
Which is the best way to page ordered results in Oracle? I've seen some samples using rownum and subqueries. Is that the way? Could you give me a sample for translating this SQL to Oracle:
SELECT fieldA,fieldB
FROM table
ORDER BY fieldA
OFFSET 5 LIMIT 14
(I'm using Oracle 10g, for what it's worth)
Thanks!
Answer:
Using the link provided below by karim79, this SQL would look like:
SELECT * FROM (
SELECT rownum rnum, a.*
FROM(
SELECT fieldA,fieldB
FROM table
ORDER BY fieldA
) a
WHERE rownum <=5+14
)
WHERE rnum >=5
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
从 oracle 12c 开始,您可以使用前 N 个查询。
http://www .oracle-base.com/articles/12c/row-limiting-clause-for-top-n-queries-12cr1.php
As of oracle 12c, you could use the top N queries.
http://www.oracle-base.com/articles/12c/row-limiting-clause-for-top-n-queries-12cr1.php
由于您使用的是 10g,因此您应该能够使用分析函数来简化 ROWNUM 方法
Since you're on 10g, you should be able to simplify the ROWNUM approach using analytic functions
您将需要使用
rownum
伪列来限制结果。请参阅此处:http://www.oracle.com /technology/oramag/oracle/06-sep/o56asktom.htmlhttp://www.oracle.com/technetwork/issue-archive/2006/06-sep/o56asktom-086197.html
You will need to use the
rownum
pseudocolumn to limit results. See here:http://www.oracle.com/technology/oramag/oracle/06-sep/o56asktom.htmlhttp://www.oracle.com/technetwork/issue-archive/2006/06-sep/o56asktom-086197.html
方法 1:对于数据库版本 Oracle12c 或更高版本
方法 2:对于数据库版本 Oracle11g 或更低版本,使用分析函数 RowNumber()
方法 3:对于数据库版本 Oracle11g 或更低版本,使用 RowNum
在某些情况下,我发现方法 3 更快优于方法 2,因为 order by 子句在方法 2 中是强制性的。但是,如果您的数据库版本是 12c 或更高版本,则必须使用方法 1。
Method-1: For database version Oracle12c or higher
Method-2: For database version Oracle11g or lower using analytical function RowNumber()
Method-3: For database version Oracle11g or lower using RowNum
In some cases, I have found method-3 is faster than method-2 since order by clause is mandatory in method 2. However, if your database version is 12c or higher you must go for method-1.