58

我正在开发一个 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
4

4 回答 4

33

从 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

于 2014-09-01T06:33:46.270 回答
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;
于 2011-03-07T15:30:27.620 回答
18

您将需要使用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

于 2010-05-26T10:47:27.033 回答
10

方法一:对于数据库版本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。

于 2019-04-23T12:29:45.730 回答