日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

DataGrid连接Access的快速分页法(2)——SQL语句的选用(升序与降序)

發布時間:2023/11/27 生活经验 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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

三、降序

(1)@PageIndex <= @FirstIndex
SELECT TOP @PageSize @QueryFields FROM @TableName WHERE @Condition ORDER BY @PrimaryKey DESC
? (2)@FirstIndex < @PageIndex <= @MiddleIndex ?
SELECT TOP @PageSize @QueryFields FROM @TableName WHERE @PrimaryKey < ( ??? SELECT MIN(@PrimaryKey) FROM ( ??????? SELECT TOP @PageSize*@PageIndex @PrimaryKey ??????? FROM @TableName ??????? WHERE @Condition ??????? ORDER BY @PrimaryKey DESC ??? ) TableA ) WHERE @Condition ORDER BY @PrimaryKey DESC
? ? (3)@MiddleIndex < @PageIndex < @LastIndex
SELECT * FROM ( ??? SELECT TOP @PageSize @QueryFields ??? FROM @TableName ??? WHERE @PrimaryKey > ( ??????? SELECT MAX(@PrimaryKey) FROM ( ??????????? SELECT TOP (@RecordCount-@PageSize*(@PageIndex+1)) @PrimaryKey ??????????? FROM @TableName ??????????? WHERE @Condition ??????????? -- ORDER BY @PrimaryKey ASC ??????? ) TableA ??? ) WHERE @Condition ??? -- ORDER BY @PrimaryKey ASC ) TableB ORDER BY @PrimaryKey DESC
? ? (4)@PageIndex >= @LastIndex ?
SELECT * FROM ( ??? SELECT TOP (@RecordCount-@PageSize*@LastIndex) @QueryFields ??? FROM @TableName ??? WHERE @Condition ??? ORDER BY @PrimaryKey ASC ) TableA ORDER BY @PrimaryKey DESC

四、總結

?????? 通過上面的討論,相信大家應該看到了該分頁方法的優勢所在。在下一篇中,我將給大家一個動態生成上面 SQL 語句的類。

總結

以上是生活随笔為你收集整理的DataGrid连接Access的快速分页法(2)——SQL语句的选用(升序与降序)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。