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
)ttwhere 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
)ttwhere 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
sqlserver 分頁查詢總結
sqlserver2008不支援關鍵字limit 所以它的分頁sql查詢語句將不能用mysql的方式進行,幸好sqlserver2008提供了top,rownumber等關鍵字,這樣就能通過這幾個關鍵字實現分頁。下面是本人在網上查閱到的幾種查詢指令碼的寫法 幾種sqlserver2008高效分頁sq...
sqlserver 分頁查詢總結
sqlserver2008不支援關鍵字limit 所以它的分頁sql查詢語句將不能用mysql的方式進行,幸好sqlserver2008提供了top,rownumber等關鍵字,這樣就能通過這幾個關鍵字實現分頁。下面是本人在網上查閱到的幾種查詢指令碼的寫法 幾種sqlserver2008高效分頁sq...
SQL Server 分頁查詢
ps,此文是純個人筆記 公司裡乙個專案裡用到了一種資料庫分頁查詢的方式 1 定義乙個臨時的table 這個table有乙個自增的之間id,和要查的資料表的主鍵id 2 再一次查詢,用id在分頁數段來and 一下結果 具體操作如下 定義個臨時表 temptable declare temptable ...