(3)@MiddleIndex @PageIndex @LastIndex
接下来看看取数据库表中后半部分记录的SQL语句。该语句跟前面的语句算法的原理是一样的,只是方法稍微不同。先取出当前页之后的所有记录的主键值,再从中选出最小值,然后取出主键值小于该最小值的前@PageSize条记录。
SELECT * FROM (SELECT TOP @PageSize @QueryFieldsFROM @TableNameWHERE @PrimaryKey (SELECT MIN(@PrimaryKey) FROM (SELECT TOP (@RecordCount-@PageSize*(@PageIndex+1)) @PrimaryKeyFROM @TableNameWHERE @ConditionORDER BY @PrimaryKey DESC) TableA) WHERE @ConditionORDER BY @PrimaryKey DESC) TableBORDER BY @PrimaryKey ASC
之所以把取数据表前半部分记录和取后半部分记录的SQL语句分开写,是因为使用取前半部分记录的SQL语句时,当前页前面的记录数目随页数递增,而我们还要从这些记录中取出它们的主键字段的值再从中选出最大值。这样一来,分页速度将随着页数的增加而减慢。因此我没有这样做,而是在当前页索引大于中间页索引时(@MiddleIndex @PageIndex)选用了分页速度随着页数的增加而加快的算法。由此可见,假设把所有分页面划分为前面、中间和后面三部分,则最前面和最后面的分页速度最快,最中间的分页速度最慢。
(本文来源于图老师网站,更多请访问https://m.tulaoshi.com/webkaifa/)例如:@PageIndex=3,红 -- 黄 -- 蓝
(4)@PageIndex = @LastIndex
取最后一页的记录可以简单地使用类似状态(1)的做法:
SELECT * FROM (SELECT TOP @PageSize @QueryFieldsFROM @TableNameWHERE @ConditionORDER BY @PrimaryKey DESC) TableA ORDER BY @PrimaryKey ASC
不过,这样产生的最后一页不一定是实际意义上的最后一页。因为最后一页的记录数未必刚好跟@PageSize相等,而上面的SQL语句是直接取得倒数的@PageSize条记录。如果想要精确地取得最后一页的记录,应该在先计算出该页的记录数,作为TOP语句的条件:
SELECT * FROM (SELECT TOP (@RecordCount-@PageSize*@LastIndex) @QueryFieldsFROM @TableName WHERE @ConditionORDER BY @PrimaryKey DESC) TableA ORDER BY @PrimaryKey ASC
降序的SQL语句
降序的SQL语句跟升序的大同小异,这里就不在罗嗦了J
(1)@PageIndex = @FirstIndex
SELECT TOP @PageSize @QueryFields FROM @TableName WHERE @Condition ORDER BY @PrimaryKey DESC
(2)@FirstIndex @PageIndex = @MiddleIndex
SELECT TOP @PageSize @QueryFieldsFROM @TableNameWHERE @PrimaryKey (SELECT MIN(@PrimaryKey) FROM (SELECT TOP @PageSize*@PageIndex @PrimaryKeyFROM @TableNameWHERE @ConditionORDER BY @PrimaryKey DESC) TableA) WHERE @ConditionORDER BY @PrimaryKey DESC(本文来源于图老师网站,更多请访问https://m.tulaoshi.com/webkaifa/)
(3)@MiddleIndex @PageIndex @LastIndex
SELECT * FROM (SELECT TOP @PageSize @QueryFieldsFROM @TableNameWHERE @PrimaryKey (SELECT MAX(@PrimaryKey) FROM (SELECT TOP (@RecordCount-@PageSize*(@PageIndex+1)) @PrimaryKeyFROM @TableNameWHERE @ConditionORDER BY @PrimaryKey ASC) TableA) WHERE @ConditionORDER BY @PrimaryKey ASC) TableB ORDER BY @PrimaryKey DESC