ICANN认证国际域名顶级注册机构
网站建设,域名注册,空间租用,软件销售,广告设计 域名注册,空间租用, 网站建设,东莞网页设计,域名注册,网站推广,网站开发,网页设计 网站推广,,百度推广,新浪推广,雅虎推广,网易推广 标志设计,画册设计,包装设计,VI策划,企业形象顾问 连邦软件加盟店,提供销遥行,管家婆,速达,用友ERP,诺顿等软件报价及销售 建站必读 腾达网络,上网帮助中心, 腾达为东莞等地,提供网站建设,网站推广,广告设计,软件销售等优质服务!
建站必读


 
 
当前位置:首页 -> 建站必读 -> .NET技术
DataGrid连接Access的快速分页法(2)——SQL语句的选用(升序)
DataGrid连接Access的快速分页法(2)——SQL语句的选用(升序)

一、相关概念

在 ACCESS 数据库中,一个表的主键(PRIMARY KEY,又称主索引)上必然建立了唯一索引(UNIQUE INDEX),因此主键字段的值是不会重复的。并且索引页依据索引列的值进行排序,每个索引记录包含一个指向它所引用的数据行的指针。我们可以利用主键这两个特点来实现对某条记录的定位,从而快速地取出某个分页上要显示的记录。



举个例子,假设主键字段为 INTEGER 型,数据库表中的记录已经按主键字段的值升序排好,那么主键字段的值为“11”的记录肯定刚好在值为“12”的记录前面(假设数据库表中存在主键的值为“12”的记录)。如果主键字段不具备 UNIQUE 约束,数据库表中将有可能存在两个或两个以上主键字段的值为“11”的记录,这样就无法确定这些记录之间的前后位置了。



下面就让我们看看如何利用主键来进行数据的分段查询吧。

二、升序

(1)@PageIndex <= @FirstIndex



取第一页的数据是再简单不过了,我们只要用TOP @PageSize 就可以取出第一页要显示的记录。因为数据表中的记录已经按主键字段的值升序排好,所以省去了 ORDER BY 子句,速度更快。



SELECT TOP @PageSize @QueryFields

FROM @TableName

WHERE @Condition

-- ORDER BY @PrimaryKey ASC





如图:@PageIndex = 0







(2)@FirstIndex < @PageIndex <= @MiddleIndex



把取数据表前半部分记录和取后半部分记录的 SQL 语句分开写,可以有效地改善性能。后面我再详细解释这个问题。现在看看取前半部分记录的 SQL 语句。先取出当前页之前的所有记录的主键值,再从中选出最大值,然后取出主键值大于该最大值的前 @PageSize 条记录。值得注意的是,这里省去了两个 ORDER BY @PrimaryKey ASC 语句,分别在最里面和最外面的 SELECT 语句。前面已经说过,数据库表中的记录已经按主键字段的值升序排好,所以我们没有必要画蛇添足。



SELECT TOP @PageSize @QueryFields

FROM @TableName

WHERE @PrimaryKey > (

SELECT MAX(@PrimaryKey) FROM (

SELECT TOP @PageSize*@PageIndex @PrimaryKey

FROM @TableName

WHERE @Condition

-- ORDER BY @PrimaryKey ASC

) TableA

) WHERE @Condition

-- ORDER BY @PrimaryKey ASC





例如:@PageIndex = 1 ,红 --> 黄 --> 蓝







(3)@MiddleIndex < @PageIndex < @LastIndex



接下来看看取数据表后半部分记录的 SQL 语句。该语句跟前面的语句算法的原理是一样的,只是方法稍微不同。



先取出当前页之后的所有记录的主键值,再从中选出最小值,然后取出主键值小于该最小值的前 @PageSize 条记录。



SELECT * FROM (

SELECT TOP @PageSize @QueryFields

FROM @TableName

WHERE @PrimaryKey < (

SELECT MIN(@PrimaryKey) FROM (

SELECT TOP (@RecordCount-@PageSize*(@PageIndex+1)) @PrimaryKey

FROM @TableName

WHERE @Condition

ORDER BY @PrimaryKey DESC

) TableA

) WHERE @Condition

ORDER BY @PrimaryKey DESC

) TableB

ORDER BY @PrimaryKey ASC





之所以把取数据表前半部分记录和取后半部分记录的 SQL 语句分开写,是因为使用取前半部分记录的 SQL 语句时,当前页前面的记录数目随页数递增,而我们还要从这些记录中取出它们的主键字段的值再从中选出最大值。这样一来,分页速度将随着页数的增加而减慢。因此我没有这样做,而是在当前页索引大于中间页索引时(@MiddleIndex < @PageIndex)选用了分页速度随着页数的增加而加快的算法。由此可见,假设把所有分页面划分为前面、中间和后面三部分,则最前面和最后面的分页速度最快,最中间的分页速度最慢。



例如:@PageIndex = 3 ,红 --> 黄 --> 蓝







(4)@PageIndex >= @LastIndex



取最后一页的记录时要先计算出该页的记录数,作为 TOP 语句的条件,而不能直接用 TOP @PageSize,这样取出来的记录并不只是最后一页的。其实很多网站确实这样做。



SELECT * FROM (

SELECT TOP (@RecordCount-@PageSize*@LastIndex) @QueryFields

FROM @TableName

WHERE @Condition

ORDER BY @PrimaryKey DESC

) TableA

ORDER BY @PrimaryKey ASC





例如:@PageIndex = 4




 
 
本站关键词:
|东莞专业网络公司|东莞速达软件|东莞财务软件|东莞ERP软件|东莞电脑维护|网页开发|域名注册|空间租用|东莞网站开发|东莞企业网站建设|国际内域名注册|石龙 虎门 中堂||东莞专业网络公司|东莞速达软件|东莞财务软件|东莞ERP软件|东莞电脑维护|网页开发|域名注册|空间租用|东莞网站开发|东莞企业网站建设|国际内域名注册|石龙 虎门 中堂||东莞专业网络公司|东莞速达软件|东莞财务软件|东莞ERP软件|东莞电脑维护|网页开发|域名注册|空间租用|东莞网站开发|东莞企业网站建设|国际内域名注册|石龙 虎门 中堂||东莞专业网络公司|东莞速达软件|东莞财务软件|东莞ERP软件|东莞电脑维护|网页开发|域名注册|空间租用|东莞网站开发|东莞企业网站建设|国际内域名注册|石龙 虎门 中堂||东莞专业网络公司|东莞速达软件|东莞财务软件|东莞ERP软件|东莞电脑维护|网页开发|域名注册|空间租用|东莞网站开发|东莞企业网站建设|国际内域名注册|石龙 虎门 中堂||东莞专业网络公司|东莞速达软件|东莞财务软件|东莞ERP软件|东莞电脑维护|网页开发|域名注册|空间租用|东莞网站开发|东莞企业网站建设|国际内域名注册|石龙 虎门 中堂||东莞专业网络公司|东莞速达软件|东莞财务软件|东莞ERP软件|东莞电脑维护|网页开发|域名注册|空间租用|东莞网站开发|东莞企业网站建设|国际内域名注册|石龙 虎门 中堂||东莞专业网络公司|东莞速达软件|东莞财务软件|东莞ERP软件|东莞电脑维护|网页开发|域名注册|空间租用|东莞网站开发|东莞企业网站建设|国际内域名注册|石龙 虎门 中堂||东莞专业网络公司|东莞速达软件|东莞财务软件|东莞ERP软件|东莞电脑维护|网页开发|域名注册|空间租用|东莞网站开发|东莞企业网站建设|国际内域名注册|石龙 虎门 中堂||东莞专业网络公司|东莞速达软件|东莞财务软件|东莞ERP软件|东莞电脑维护|网页开发|域名注册|空间租用|东莞网站开发|东莞企业网站建设|国际内域名注册|石龙 虎门 中堂||东莞专业网络公司|东莞速达软件|东莞财务软件|东莞ERP软件|东莞电脑维护|网页开发|域名注册|空间租用|东莞网站开发|东莞企业网站建设|国际内域名注册|石龙 虎门 中堂||东莞专业网络公司|东莞速达软件|东莞财务软件|东莞ERP软件|东莞电脑维护|网页开发|域名注册|空间租用|东莞网站开发|东莞企业网站建设|国际内域名注册|石龙 虎门 中堂||东莞专业网络公司|东莞速达软件|东莞财务软件|东莞ERP软件|东莞电脑维护|网页开发|域名注册|空间租用|东莞网站开发|东莞企业网站建设|国际内域名注册|石龙 虎门 中堂||东莞专业网络公司|东莞速达软件|东莞财务软件|东莞ERP软件|东莞电脑维护|网页开发|域名注册|空间租用|东莞网站开发|东莞企业网站建设|国际内域名注册|石龙 虎门 中堂|
域名注册 | 虚拟主机 | 网站建设 | 网站推广 | 广告设计 | 帮助中心 | 软件中心 | 关于腾达
东莞市腾达信息工程有限公司      本站网络实名: 东莞网站建设
地址:东莞市新城市中心区第一国际B座610   邮编:523007
电话:0769-22026071 22026072 传真:0769-22026076 24小时服务热线:13712032014
© 2002~2005 腾达网络   版权所有