Oracle 中分页的 LIMIT 和 OFFSET 的替代方法 [重复]
Posted
技术标签:
【中文标题】Oracle 中分页的 LIMIT 和 OFFSET 的替代方法 [重复]【英文标题】:Alternatives to LIMIT and OFFSET for paging in Oracle [duplicate] 【发布时间】:2011-02-24 02:59:02 【问题描述】:我正在开发一个 Web 应用程序,需要对有序结果进行分页。为此,我通常使用 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
【问题讨论】:
我认为最后一行应该写WHERE rnum >5
(而不是>=
),否则你会得到15条记录,只跳过前4条。
【参考方案1】:
从 oracle 12c 开始,您可以使用前 N 个查询。
SELECT fieldA,fieldB
FROM table
ORDER BY fieldA
OFFSET 5 ROWS FETCH NEXT 14 ROWS ONLY;
http://www.oracle-base.com/articles/12c/row-limiting-clause-for-top-n-queries-12cr1.php
【讨论】:
关于OFFSET
,请看Markus Winand Paging Through Results。
能否请您在这里指导:***.com/questions/62499069/…?【参考方案2】:
由于您使用的是 10g,您应该能够使用分析函数简化 ROWNUM 方法
SELECT fieldA,
fieldB
FROM (SELECT fieldA,
fieldB,
row_number() over (order by fieldA) rnk
FROM table_name)
WHERE rnk BETWEEN 5 AND 14;
【讨论】:
非常感谢,这正是我所需要的 :) 为什么哦,为什么 oracle 坚持以艰难的方式做事!【参考方案3】:您需要使用rownum
伪列来限制结果。见这里:
http://www.oracle.com/technology/oramag/oracle/06-sep/o56asktom.html
http://www.oracle.com/technetwork/issue-archive/2006/06-sep/o56asktom-086197.html
【讨论】:
关于rownum如何运作的有趣读物:blog.lishman.com/2008/03/rownum.html【参考方案4】:方法一:对于数据库版本Oracle12c或更高版本
SELECT fieldA, fieldB
FROM table
ORDER BY fieldA
OFFSET 5 ROWS FETCH NEXT 14 ROWS ONLY
方法二:对于Oracle11g或更低版本的数据库,使用解析函数RowNumber()
SELECT fieldA, fieldB
FROM (
SELECT fieldA, fieldB,
row_number() over (order by fieldA) rowRank
FROM table_name
)
WHERE rowRank BETWEEN 5 AND 14;
方法3:对于Oracle11g或更低版本的数据库,使用RowNum
SELECT T.* FROM (
SELECT T.*, rowNum as rowIndex
FROM (
SELECT fieldA, fieldB,
FROM table_name
)T)T
WHERE rowIndex > 0 AND rowIndex <= 20;
在某些情况下,我发现方法 3 比方法 2 更快,因为方法 2 中必须使用 order by 子句。但是,如果您的数据库版本是 12c 或更高版本,则必须使用方法 1。
【讨论】:
能否请您在这里指导:***.com/questions/62499069/… ?以上是关于Oracle 中分页的 LIMIT 和 OFFSET 的替代方法 [重复]的主要内容,如果未能解决你的问题,请参考以下文章
Oracle的分页是怎样分的啊。我知道MySQL用的是limit关键字,但是Oracle是怎么样的呢?谁回答的好,我把分给