我不像我想的那样熟悉Oracle.我有大约250k的记录,我想每页显示100个.目前,我有一个存储过程,它使用数据适配器和数据集以及dataadapter.Fill(dataset)方法从存储过程的结果中检索数据集中的所有25万条记录.如果我将"页码"和"每页记录数"作为整数值,我可以作为参数传递,那么返回该特定部分的最佳方法是什么.比方说,如果我将10作为页码传递,120作为页数,则从select语句中将它给予我1880到1200,或类似的东西,我脑子里的数学可能会关闭.
我在.NET中用C#做这个,认为这不重要,如果我能在sql端正确,那我就应该很酷.
更新:我能够使用Brian的建议,而且效果很好.我想进行一些优化,但页面会在4到5秒而不是一分钟内出现,我的分页控件能够与我的新存储过程很好地集成.
这样的事情应该有效:来自Frans Bouma的博客
SELECT * FROM ( SELECT a.*, rownum r__ FROM ( SELECT * FROM ORDERS WHERE CustomerID LIKE 'A%' ORDER BY OrderDate DESC, ShippingDate DESC ) a WHERE rownum < ((pageNumber * pageSize) + 1 ) ) WHERE r__ >= (((pageNumber-1) * pageSize) + 1)
问汤姆的分页和非常非常有用的分析功能.
这是摘自该页面:
select * from ( select /*+ first_rows(25) */ object_id,object_name, row_number() over (order by object_id) rn from all_objects) where rn between :n and :m order by rn;
为了完整性,对于寻求更现代化解决方案的人来说,在Oracle 12c中有一些新功能,包括更好的分页和顶级处理.
分页
分页看起来像这样:
SELECT * FROM user ORDER BY first_name OFFSET 5 ROWS FETCH NEXT 10 ROWS ONLY;
前N个记录
获得最佳记录如下所示:
SELECT * FROM user ORDER BY first_name FETCH FIRST 5 ROWS ONLY
注意上面的查询示例如何都有ORDER BY
子句.新命令遵循这些命令并在已排序的数据上运行.
我无法找到一个很好的Oracle参考页FETCH
或OFFSET
但这个页面有这些新功能很好的概述.
只想总结一下答案和评论.分页的方式有很多种.
在oracle 12c之前没有OFFSET/FETCH功能,所以请看@jasonk建议的白皮书.这是我发现的关于不同方法的最完整的文章,详细解释了优缺点.将这些文件复制粘贴需要花费大量时间,所以我不会这样做.
还有一篇来自jooq创作者的好文章解释了oracle和其他数据库分页的一些常见警告.jooq的博文
好消息,因为oracle 12c我们有一个新的OFFSET/FETCH功能.OracleMagazine 12c的新功能.请参阅"前N个查询和分页"
您可以通过发出以下语句来检查您的oracle版本
SELECT * FROM V$VERSION
请尝试以下方法:
SELECT * FROM (SELECT FIELDA, FIELDB, FIELDC, ROW_NUMBER() OVER (ORDER BY FIELDC) R FROM TABLE_NAME WHERE FIELDA = 10 ) WHERE R >= 10 AND R <= 15;
通过[tecnicume]