Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql Oracle中分页限制和偏移的替代方案_Sql_Oracle_Sql Limit - Fatal编程技术网

Sql Oracle中分页限制和偏移的替代方案

Sql Oracle中分页限制和偏移的替代方案,sql,oracle,sql-limit,Sql,Oracle,Sql Limit,我正在开发一个web应用程序,需要对有序的结果进行分页。为此,我通常使用限制/偏移 在Oracle中,哪种方式是页面排序结果的最佳方式?我见过一些使用rownum和子查询的示例。是这样吗?您能否给我一个将此SQL转换为Oracle的示例: SELECT fieldA,fieldB FROM table ORDER BY fieldA OFFSET 5 LIMIT 14 我正在使用Oracle 10g,这是值得的 谢谢 答复: 使用karim79提供的以下链接,此SQL看起来像: SELE

我正在开发一个web应用程序,需要对有序的结果进行分页。为此,我通常使用限制/偏移

在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
您需要使用rownum伪列来限制结果。请看这里:


由于您使用的是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 12c开始,您可以使用前N个查询

SELECT fieldA,fieldB 
FROM table 
ORDER BY fieldA 
OFFSET 5 ROWS FETCH NEXT 14 ROWS ONLY;

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

SELECT fieldA, fieldB 
FROM table 
ORDER BY fieldA 
OFFSET 5 ROWS FETCH NEXT 14 ROWS ONLY
方法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;
方法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快,因为ORDERBY子句在方法2中是强制性的。但是,如果您的数据库版本为12c或更高,则必须选择方法1。

阅读rownum如何操作的有趣内容:我认为最后一行应该说rnum>5不是>=,否则您将获得15条记录,只跳过前四条。非常感谢,这正是我所需要的:为什么,为什么甲骨文坚持用艰难的方式做事!关于抵销,请看一下马库斯·温纳德。你能在这里引导吗?