用于在Oracle中进行分页的LIMIT和OFFSET的替代方法

dan*_*lla 47 sql oracle

我正在开发一个Web应用程序,需要分页排序结果.我通常使用LIMIT/OFFSET来实现此目的.

在Oracle中寻找有序结果的最佳方法是哪种?我见过一些使用rownum和子查询的示例.那是这样的吗?你能给我一个将这个SQL翻译成Oracle的示例:

SELECT fieldA,fieldB 
FROM table 
ORDER BY fieldA 
OFFSET 5 LIMIT 14
Run Code Online (Sandbox Code Playgroud)

(我正在使用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
Run Code Online (Sandbox Code Playgroud)

Jus*_*ave 22

由于您使用的是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;
Run Code Online (Sandbox Code Playgroud)

  • 非常感谢,这正是我所需要的:)为什么oracle为什么坚持以艰难的方式做事! (3认同)

小智 20

从oracle 12c开始,您可以使用前N个查询.

SELECT fieldA,fieldB 
FROM table 
ORDER BY fieldA 
OFFSET 5 ROWS FETCH NEXT 14 ROWS ONLY;
Run Code Online (Sandbox Code Playgroud)

http://www.oracle-base.com/articles/12c/row-limiting-clause-for-top-n-queries-12cr1.php


mij*_*ved 9

方法一:对于数据库版本 Oracle12c 或更高版本

SELECT fieldA, fieldB 
FROM table 
ORDER BY fieldA 
OFFSET 5 ROWS FETCH NEXT 14 ROWS ONLY
Run Code Online (Sandbox Code Playgroud)

方法 2:对于 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;
Run Code Online (Sandbox Code Playgroud)

方法 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;
Run Code Online (Sandbox Code Playgroud)

在某些情况下,我发现方法 3 比方法 2 快,因为方法 2 中的 order by 子句是强制性的。但是,如果您的数据库版本是 12c 或更高版本,则必须使用方法 1。