下面是本人在網上查閱到的幾種查詢腳本的寫法特此分享到腳本之家平臺,供大家參考
sqlserver2008不支持關鍵字limit ,所以它的分頁sql查詢語句將不能用MySQL的方式進行,幸好sqlserver2008提供了top,rownumber等關鍵字,這樣就能通過這幾個關鍵字實現分頁。
下面是本人在網上查閱到的幾種查詢腳本的寫法:
幾種sqlserver2008高效分頁sql查詢語句
top方案:
sql code:
select?top?10?*?from?table1 where?id?not?in(select?top?開始的位置?id?from?table1)
max:
sql code:
select?top?10?*?from?table1 where?id>(select?max(id) from?(select?top?開始位置?id?from?table1?order?by?id)tt)
row:
sql code:
select?* from?( select?row_number()over(order?by?tempcolumn)temprownumber,* from?(select?top?開始位置+10?tempcolumn=0,*?from?table1)t )tt where?temprownumber>開始位置
3種分頁方式,分別是max方案,top方案,row方案
效率:
第1:row
第2:max
第3:top
缺點:
max:必須用戶編寫復雜sql,不支持非唯一列排序
top:必須用戶編寫復雜sql,不支持復合主鍵
row:不支持sqlserver2000
測試數據:
共320萬條數據,每頁顯示10條數據,分別測試了2萬頁、15萬頁和32萬頁。
頁碼,top方案,max方案,row方案
2萬,60ms,46ms,33ms
15萬,453ms,343ms,310ms
32萬,953ms,720ms,686ms
是一種通過程序拼接sql語句的分頁方案,
用戶提過的sql語句不需要編寫復雜的sql邏輯
諾用戶提供sql如下
sql code
select?*?from?table1
從第5條開始,查詢5條,處理后sql變為
sql code
select?* from?( select?row_number()over(order?by?tempcolumn)temprownumber,* from?(select?top?10?tempcolumn=0,*?from?table1)t )tt where?temprownumber>5
這是什么意思呢?分解一下
首先將用戶輸入的sql語句轉稍稍修改
在select后添加top 開始位置+條數變成
再外加一列tempcolum,變成這樣
sql code
select?top?20?tempcolumn=0,*?from?clazz
嵌套一層,這樣便可查詢出行號
剛才那個列就是用來這里order by用的
(也不知道sqlserver的row_number函數為什么必須要order by)
sql code
select?row_number()over(order?by?tempcolumn)temprownumber,* from?(修改過的查詢)t
再套一層,過濾掉行號小于開始位置的行
sql code
select?*?from?(第二層)tt where?temprownumber>10