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

來源:互聯網
上載者:User
access|datagrid|分頁|語句 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


相關文章

E-Commerce Solutions

Leverage the same tools powering the Alibaba Ecosystem

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。