我并不像我希望的那样熟悉Oracle。我有大约25万条记录,我想每页显示100条记录。目前,我有一个存储过程,它使用数据适配器和dataset将25万条记录检索到dataset,并使用dataadapter.Fill(dataset)方法对来自存储过程的结果进行处理。如果我将"Page Number“和"Number of records page”作为可以作为参数传递的整数值,那么返回该特定部分的最佳方法是什么?比方说,如果我传递10作为页码,120作为页数,从select语句中得到1880到1200,或者类似的东西,我头脑中的数学可能会出错。
我正在用.NET和C#做这件事,尽管这并不重要,如果我能在SQL端做到这一点,那么我应该很酷。
更新:我能够使用Brian的建议,它工作得很好。我想做一些优化工作,但页面在4到5秒而不是一分钟内就会出现,而且我的分页控制能够很好地集成到我新存储的proc中。
发布于 2008-10-27 22:46:31
这样的代码应该可以工作:From Frans Bouma's Blog
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)
发布于 2008-10-27 22:57:20
关于分页的Ask Tom和非常非常有用的分析函数。
这是该页面的摘录:
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;
发布于 2015-11-03 19:32:28
我只想总结一下答案和评论。有许多方法可以进行分页。
在oracle12c之前,没有偏移/获取功能,所以看看@jasonk建议的whitepaper。这是我找到的关于不同方法的最完整的文章,详细解释了各种方法的优缺点。在这里复制粘贴它们会花费大量的时间,所以我就不这么做了。
jooq创建者也有一篇很好的文章,解释了oracle和其他数据库分页的一些常见注意事项。jooq's blogpost
好消息是,从oracle 12c开始,我们有了一个新的偏移/获取功能。OracleMagazine 12c new features。请参考"Top-N查询和分页“
您可以通过发出以下语句来检查您的oracle版本
SELECT * FROM V$VERSION
https://stackoverflow.com/questions/241622
复制相似问题