请说说sql高效分页、并其实现思路、分别说说top和rownum、内存分页与数据库分页、实现步骤、代码清晰明了、最好有注释的、谢谢了(jsp或asp.net的)??
你这个问题问的好啊,没几百字说不明白,晚上有很多,你自己去Search吧~~
网上已经有很多算法了,我一直用颠颠倒倒法,是拼接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 的方式查询数据。但是并没有要求主键自身必须能够排序。