国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數據庫 > Access > 正文

DataGrid連接Access的快速分頁法(2)——SQL語句的選用(升序)

2024-09-07 19:04:58
字體:
來源:轉載
供稿:網友


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 (@[email protected]*(@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 (@[email protected]*@lastindex) @queryfields
from @tablename
where @condition
order by @primarykey desc
) tablea
order by @primarykey asc


例如:@pageindex = 4
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 防城港市| 威宁| 雅安市| 鹿泉市| 康平县| 盐边县| 岗巴县| 海阳市| 崇信县| 夏邑县| 蒙自县| 涞源县| 康平县| 九龙城区| 江阴市| 博兴县| 西华县| 道孚县| 凉山| 施秉县| 常德市| 漠河县| 景泰县| 玉林市| 方山县| 清河县| 汶川县| 城固县| 临城县| 滦平县| 天长市| 华坪县| 甘洛县| 平远县| 玉树县| 红河县| 深泽县| 柘荣县| 镇康县| 巴彦淖尔市| 沂源县|