資料庫分段查詢技術的實作
分段查詢的意思是,在查詢資料時不是一次性全部將附合條件的資料都讀取在記憶體裡。一次將資料全部查詢出來,將降低查詢效率,給客戶端的反應會很長時間,而分段查詢的意思是按照當前分頁的大小,每次查詢的結果就是每頁顯示的數量,大大提升了查詢效率
例如資料庫中有100000條數據,每頁20條,當點擊頁碼的時候,只查詢該頁碼需要顯示的那20條內容,不查詢別的頁面的,即每次只查詢20條數據
SQL Server
從資料庫表中的第M筆記錄開始取N筆記錄,利用Top關鍵字:注意如果Select語句中既有top,又有order by,則是從排序好的結果集中選擇:
SELECT *
FROM ( SELECT Top N * FROM (SELECT Top (M + N - 1) * FROM 表名称 Order by 主键 desc) t1 ) t2 Order by 主键 asc
例如從表Sys_option(主鍵為sys_id)中從10筆記錄還是檢索20個記錄,語句如下:
SELECT * FROM ( SELECT TOP 20 * FROM (SELECT TOP 29 * FROM Sys_option order by sys_id desc) t1) t2 Order by sys_id asc
檢索N筆記錄
SELECT * FROM (SELECT ROWNUM r,t1.* From 表名称 t1 where rownum < M + N) t2 where t2.r >= M
例如從表Sys_option(主鍵為sys_id)中從10筆記錄還是檢索20筆記錄,語句如下:
SELECT * FROM (SELECT ROWNUM R,t1.* From Sys_option where rownum < 30 ) t2 Where t2.R >= 10
My 資料庫最簡單,是利用程式碼,LIMIT [offset,] rows從資料庫表中M筆記錄開始檢索N筆記錄的語句為:
以下是程式碼片段:
SELECT * FROM 表名称 LIMIT M,N
以下是程式碼片段:
select * from sys_option limit 10,20
以前用ORACLE時,分頁使用ROWNUM做條件就可以了,不管效率如何,反正實現起來比較容易。
那麼ACCESS如何實現分頁功能呢?我看了一些資料說得有些複雜,要寫好程式碼,我想到一個好方法,來跟大家分享,也就是一個SQL語句:
select top 15 * from YOURTABLE where ID not in(select top 15 ID from YOURTABLE order by ID desc) order by ID desc
稍解釋一下,15呢是每頁的行數,YOURTABLE是表名,ID是表中主鍵字段(當然你也可以用別的),我上面的SQL語句,是取出第二頁(第二個15筆)記錄。想變頁碼,只要把後面的15變成對應的倍數就可以了。
用這種方式,結合不含分頁功能的DataRepeater插件,我三下五除二就寫好的記事本程式。不要笑話我,我的.NET的新手,先寫這個練練手。
如果有人有興趣,請留言,我可以把程式碼貼出來。
請注意:
如果取第一個15筆記錄,SQL語句不能這樣寫:
select top 15 * from YOURTABLE where ID not in(select top 0 ID from YOURTABLE order by ID desc) order by ID desc
這樣寫會報錯。直接寫成:
select top 15 * from YOURTABLE order by ID desc
如果要加限制條件,可以這樣寫:
select top 15 * from YOURTABLE where ID not in(select top 15 ID from YOURTABLE where NAME='wallimn' order by ID desc) and NAME='wallimn' order by ID desc