我正在开发一个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
答案 0 :(得分:20)
由于您使用的是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;
答案 1 :(得分:19)
从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
答案 2 :(得分:15)
您需要使用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
答案 3 :(得分:1)
方法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:对于使用RowNum的Oracle11g或更低版本的数据库
SELECT T.* FROM (
SELECT T.*, rowNum as rowIndex
FROM (
SELECT fieldA, fieldB,
FROM table_name
)T)T
WHERE rowIndex > 0 AND rowIndex <= 20;
在某些情况下,我发现method-3比method-2快,因为order by子句在方法2中是强制性的。但是,如果您的数据库版本为12c或更高,则必须使用method-1。