麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 數(shù)據(jù)庫 > Access > 正文

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

2024-09-07 19:04:58
字體:
供稿:網(wǎng)友


datagrid連接access的快速分頁法(2)——sql語句的選用(升序)
一、相關(guān)概念
在 access 數(shù)據(jù)庫中,一個(gè)表的主鍵(primary key,又稱主索引)上必然建立了唯一索引(unique index),因此主鍵字段的值是不會(huì)重復(fù)的。并且索引頁依據(jù)索引列的值進(jìn)行排序,每個(gè)索引記錄包含一個(gè)指向它所引用的數(shù)據(jù)行的指針。我們可以利用主鍵這兩個(gè)特點(diǎn)來實(shí)現(xiàn)對(duì)某條記錄的定位,從而快速地取出某個(gè)分頁上要顯示的記錄。

舉個(gè)例子,假設(shè)主鍵字段為 integer 型,數(shù)據(jù)庫表中的記錄已經(jīng)按主鍵字段的值升序排好,那么主鍵字段的值為“11”的記錄肯定剛好在值為“12”的記錄前面(假設(shè)數(shù)據(jù)庫表中存在主鍵的值為“12”的記錄)。如果主鍵字段不具備 unique 約束,數(shù)據(jù)庫表中將有可能存在兩個(gè)或兩個(gè)以上主鍵字段的值為“11”的記錄,這樣就無法確定這些記錄之間的前后位置了。

下面就讓我們看看如何利用主鍵來進(jìn)行數(shù)據(jù)的分段查詢吧。
二、升序
(1)@pageindex <= @firstindex

取第一頁的數(shù)據(jù)是再簡單不過了,我們只要用top @pagesize 就可以取出第一頁要顯示的記錄。因?yàn)閿?shù)據(jù)表中的記錄已經(jīng)按主鍵字段的值升序排好,所以省去了 order by 子句,速度更快。

select top @pagesize @queryfields
from @tablename
where @condition
-- order by @primarykey asc


如圖:@pageindex = 0



(2)@firstindex < @pageindex <= @middleindex

把取數(shù)據(jù)表前半部分記錄和取后半部分記錄的 sql 語句分開寫,可以有效地改善性能。后面我再詳細(xì)解釋這個(gè)問題。現(xiàn)在看看取前半部分記錄的 sql 語句。先取出當(dāng)前頁之前的所有記錄的主鍵值,再從中選出最大值,然后取出主鍵值大于該最大值的前 @pagesize 條記錄。值得注意的是,這里省去了兩個(gè) order by @primarykey asc 語句,分別在最里面和最外面的 select 語句。前面已經(jīng)說過,數(shù)據(jù)庫表中的記錄已經(jīng)按主鍵字段的值升序排好,所以我們沒有必要畫蛇添足。

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 ,紅 --> 黃 --> 藍(lán)



(3)@middleindex < @pageindex < @lastindex

接下來看看取數(shù)據(jù)表后半部分記錄的 sql 語句。該語句跟前面的語句算法的原理是一樣的,只是方法稍微不同。

先取出當(dāng)前頁之后的所有記錄的主鍵值,再從中選出最小值,然后取出主鍵值小于該最小值的前 @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


之所以把取數(shù)據(jù)表前半部分記錄和取后半部分記錄的 sql 語句分開寫,是因?yàn)槭褂萌∏鞍氩糠钟涗浀?sql 語句時(shí),當(dāng)前頁前面的記錄數(shù)目隨頁數(shù)遞增,而我們還要從這些記錄中取出它們的主鍵字段的值再從中選出最大值。這樣一來,分頁速度將隨著頁數(shù)的增加而減慢。因此我沒有這樣做,而是在當(dāng)前頁索引大于中間頁索引時(shí)(@middleindex < @pageindex)選用了分頁速度隨著頁數(shù)的增加而加快的算法。由此可見,假設(shè)把所有分頁面劃分為前面、中間和后面三部分,則最前面和最后面的分頁速度最快,最中間的分頁速度最慢。

例如:@pageindex = 3 ,紅 --> 黃 --> 藍(lán)



(4)@pageindex >= @lastindex

取最后一頁的記錄時(shí)要先計(jì)算出該頁的記錄數(shù),作為 top 語句的條件,而不能直接用 top @pagesize,這樣取出來的記錄并不只是最后一頁的。其實(shí)很多網(wǎng)站確實(shí)這樣做。

select * from (
select top (@[email protected]*@lastindex) @queryfields
from @tablename
where @condition
order by @primarykey desc
) tablea
order by @primarykey asc


例如:@pageindex = 4
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 国产成人免费精品 | 黄色的视频免费观看 | 免费国产在线观看 | 亚洲婷婷日日综合婷婷噜噜噜 | 亚洲精品成人久久久 | 99亚洲伊人久久精品影院红桃 | 免费放黄网站在线播放 | 色综av| 国产精品免费小视频 | 伊人在线视频 | 欧美一区二区三区中文字幕 | 亚洲影视中文字幕 | 亚洲精品成人av在线 | 56av国产精品久久久久久久 | 久久久久亚洲视频 | 综合网天天射 | 久久99精品久久久久久青青日本 | 欧洲成人综合网 | 成人爽a毛片免费啪啪红桃视频 | 欧美国产日韩在线观看成人 | 一级毛片在线观看视频 | 欧美成人黄色 | 久久国产精品久久久久久久久久 | 91精品国| 牛牛碰在线视频 | 中国国语毛片免费观看视频 | 国产一区二区三区高清 | 成人免费精品视频 | 亚洲aⅴ免费在线观看 | 亚洲国产精品一区二区久久 | av电影免费在线看 | 欧美成人免费 | 日韩中文字幕三区 | 高清在线国产 | 中韩毛片| 在线观看视频毛片 | 欧美不卡三区 | 久久日本| 欧美成人激情 | 欧美一级黄色片在线观看 | 久久精品视频黄色 |