很久没有被分页困惑了,因为一直以来操作的表中数据量都不大,所以很偷懒地使用了纪录集的PageSize与AbsolutePage。这个的弊端就是一次性地把用到用不到的记录全读出来了,记录数一多就很慢。
解决的思路是,找到一种方法,只读出需要的记录~呵呵~
比较常见的是利用了IN 操作符,例如
SELECT TOP PageSize * From A WHERE id NOT IN (SELECT TOP PageSize*PageNo id FROM A WHERE )
注意一下加红的那部分,select 语句中用到的是他们的值
同样的,数据不是很多的话还行,多了同样是不行的,因为IN的效率不高嘛
思来想去,找到一个方法,利用了id(俺一直是把它设成自增的)的一个特性,
id是从小到大排的,其实只要找到当前页最小id应该大于多少,然后再用上TOP 操作符。
看看
SELECT TOP PageSize * FROM A WHERE id > MinID
第一页的 MinID 当然是 0,然后就可以得出第一页最大的id值,它正是第二页中id必须大于的值,类推~
当然,有一个问题,如果你想直接跳到指定页~~那就不好办了:(
跳到最后一页到还是很简单的,只要使用ORDER BY id DESC
这个思想还是有个破绽呀,如果不按id排序的话,就会很麻烦,可以想到的解决方法是,将上面的做为子查询,外面再套一层查询~
如果看不明白的话,抱歉,那只说明俺的表达能力低虐~而已~
呵呵~所以不用放心上啦!
)
、)
)