当前位置: 首页 > news >正文

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
作者:黎波

相关文章:

  • 音乐人声分离[源码教程连接]
  • SoundTouch音频处理库
  • DataGrid连接Access的快速分页法(1)——需求与现状
  • 自动驾驶:使用 3D 时空卷积网络的自监督点云预测
  • 文件共享的新面孔——《纽约时报》专访BitTorrent之父
  • 实战OpenPose项目1:开篇使用文档
  • 实战OpenPose项目2:开发环境配置与demo运行
  • Martin Fowler:设计已死?
  • 实战OpenPose项目3:pytorch 实现openpose(包括手和身体姿态估计)
  • 下一步CSDN Blog要增加和完善的功能
  • 实战OpenPose项目4:实时准确的全身多人姿态估计和跟踪系统
  • 知识图谱:知识表示学习(KRL)/知识嵌入(KE)必读论文
  • 关于国际标准书号ISBN
  • AI模型设计:C语言版 TensorFlow2.x安装与使用
  • AI模型设计必备:PyTorch与TensorFlow模型C++与python实现学习资料
  • 分享的文章《人生如棋》
  • 【知识碎片】第三方登录弹窗效果
  • CoolViewPager:即刻刷新,自定义边缘效果颜色,双向自动循环,内置垂直切换效果,想要的都在这里...
  • CSS居中完全指南——构建CSS居中决策树
  • echarts花样作死的坑
  • Go 语言编译器的 //go: 详解
  • Linux快速复制或删除大量小文件
  • Python语法速览与机器学习开发环境搭建
  • Spring Cloud(3) - 服务治理: Spring Cloud Eureka
  • v-if和v-for连用出现的问题
  • 欢迎参加第二届中国游戏开发者大会
  • 力扣(LeetCode)56
  • 前端学习笔记之原型——一张图说明`prototype`和`__proto__`的区别
  • 算法之不定期更新(一)(2018-04-12)
  • 走向全栈之MongoDB的使用
  • ionic入门之数据绑定显示-1
  • Java性能优化之JVM GC(垃圾回收机制)
  • 你学不懂C语言,是因为不懂编写C程序的7个步骤 ...
  • 专访Pony.ai 楼天城:自动驾驶已经走过了“从0到1”,“规模”是行业的分水岭| 自动驾驶这十年 ...
  • ​​​​​​​sokit v1.3抓手机应用socket数据包: Socket是传输控制层协议,WebSocket是应用层协议。
  • # 手柄编程_北通阿修罗3动手评:一款兼具功能、操控性的电竞手柄
  • $.extend({},旧的,新的);合并对象,后面的覆盖前面的
  • (附源码)springboot 房产中介系统 毕业设计 312341
  • (附源码)springboot“微印象”在线打印预约系统 毕业设计 061642
  • (转)es进行聚合操作时提示Fielddata is disabled on text fields by default
  • (转)一些感悟
  • .net 7 上传文件踩坑
  • .Net MVC + EF搭建学生管理系统
  • .Net 中的反射(动态创建类型实例) - Part.4(转自http://www.tracefact.net/CLR-and-Framework/Reflection-Part4.aspx)...
  • .NET(C#) Internals: as a developer, .net framework in my eyes
  • .NET框架设计—常被忽视的C#设计技巧
  • @四年级家长,这条香港优才计划+华侨生联考捷径,一定要看!
  • [ C++ ] STL_stack(栈)queue(队列)使用及其重要接口模拟实现
  • [2009][note]构成理想导体超材料的有源THz欺骗表面等离子激元开关——
  • [2017][note]基于空间交叉相位调制的两个连续波在few layer铋Bi中的全光switch——
  • [Android Pro] Notification的使用
  • [Android] Amazon 的 android 音视频开发文档
  • [C# 基础知识系列]专题十六:Linq介绍
  • [C#]科学计数法(scientific notation)显示为正常数字
  • [C#C++]类CLASS