首页 新闻 搜索 专区 学院

请说说sql高效分页??

0
悬赏园豆:10 [已关闭问题]

请说说sql高效分页、并其实现思路、分别说说top和rownum、内存分页与数据库分页、实现步骤、代码清晰明了、最好有注释的、谢谢了(jsp或asp.net的)??

问题补充: 暂时不用分页控件!!手写分页代码!!
天空無限大的主页 天空無限大 | 初学一级 | 园豆:185
提问于:2010-06-09 13:55
< >
分享
其他回答(1)
0

你这个问题问的好啊,没几百字说不明白,晚上有很多,你自己去Search吧~~

觉知的凡夫 | 园豆:468 (菜鸟二级) | 2010-06-09 14:07
0

网上已经有很多算法了,我一直用颠颠倒倒法,是拼接SQL的,兼容多种数据库,不喜欢用存储过程。

公式:
select [显示的字段] from [表名|视图名] where [主键字段] in
    ( select top PageSize [主键字段] from
        (select top {PageSize * PageIndex} [主键字段] , [排序字段] from     --有几个排序字段就写几个字段
            [表名|视图名] [ where 查询条件 ]
            order by             
                [排序字段1] asc|desc ,[排序字段2] desc|asc,[主键字段] asc|desc     
        ) as aa     
        order by     
            [排序字段1] desc|asc,        --如果上面是倒序,那么这里就是正序
            [排序字段2] asc|desc,[主键字段] desc|asc
    )
order by
    [排序字段1] asc|desc,    --如果上面是倒序,那么这里就是正序,所谓颠颠倒倒。
    [排序字段2] desc|asc,[主键字段] asc|desc

说明:

Products表为例,一页显示10条数据,CategoryID = 3 为查询条件,按照UnitPrice倒序,由于UnitPrice 字段可能有重复值,所以加上一个排序字段——ProductID ,即按照 UnitPrice desc,ProductID来排序。 显示第二页的数据,SQL语句:
select * from Products where ProductID in
    (select top 10 ProductID from
        (select top 20 ProductID , UnitPrice from Products where CategoryID = 3 order by UnitPrice desc,ProductID ) as aa  
     order by UnitPrice asc, ProductID desc)
order by UnitPrice desc, ProductID

这里查询条件加一次就可以。
第三个select 语句,要取从第一条数据到要显示的页的数据,越是后面的记录top n就会越大,提取的数据只写排序需要的字段(主键字段和排序字段)。
第二个select 语句是去掉前面不需要的页里的数据,只保留要显示的页号里的数据。
第一个select 语句,用主键字段 in () 的方式提取其他需要的字段。
这种分页算法有一个小的bug,就是显示最后一页数据的时候,会多出来几条记录,不过这个bug已经在分页控件里面修正了,最后一页的分页算法,采用特殊的select语句。
就是要求表必须有主键,而不能是联合主键,引为要用 in 的方式查询数据。但是并没有要求主键自身必须能够排序。

Astar | 园豆:40805 (高人七级) | 2010-06-09 15:45
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册