知(zhi)方可(ke)補不足(zu)~SQL2005使(shi)用ROW_NUMBER() OVER()進行數據分(fen)頁
數(shu)據(ju)分頁是(shi)這個(ge)經常說的(de)東(dong)西,無論(lun)在WEBForm還是(shi)WinForm中它都會被單獨(du)拿出來,或者(zhe)是(shi)公(gong)用組件,或者(zhe)是(shi)公(gong)用類庫,反正(zheng)對(dui)于數(shu)據(ju)分頁這個(ge)東(dong)西,總是(shi)我們關注的(de)一(yi)個(ge)話(hua)題,但事(shi)實(shi)上(shang),數(shu)據(ju)分頁歸根(gen)結底(di)是(shi)數(shu)據(ju)庫的(de)東(dong)西,更直接(jie)的(de)說,它是(shi)數(shu)據(ju)表(biao)的(de)范(fan)疇(chou),對(dui)于一(yi)個(ge)SQL請求來說,你要取數(shu)據(ju),要取多少條,從(cong)哪條開始取,這事(shi)實(shi)上(shang)就是(shi)分頁實(shi)現的(de)原(yuan)理(li)。
SQL更新到2005版之(zhi)后,為開發者提(ti)供了不少函數,ROW_NUMBER() OVER ()就是其中之(zhi)一(yi),它可(ke)以為你的結果(guo)集生成一(yi)個行(xing)號,并可(ke)以快速的主位到第幾條數據。
MSDN上(shang)對(dui)它的應(ying)用
USE AdventureWorks2012; GO SELECT ROW_NUMBER() OVER(ORDER BY SalesYTD DESC) AS Row, FirstName, LastName, ROUND(SalesYTD,2,1) AS "Sales YTD" FROM Sales.vSalesPerson WHERE TerritoryName IS NOT NULL AND SalesYTD <> 0;
結(jie)果會把集合加上行(xing)號,如下:
在項目中,分(fen)頁功能的(de)應(ying)用,代碼如下:
SELECT *FROM (SELECT ROW_NUMBER() OVER ( ORDER BY a.orderid ) AS row ,* FROM dbo.Order_Info_View AS a where CONVERT(CHAR(7),a.buytime,20)='2010-04'and a.agentid=3455) AS b WHERE b.row BETWEEN 1 AND 20
事實上(shang),把上(shang)面的(de)代碼(ma)改一下,就可(ke)以方例的(de)實現對某(mou)頁數據的(de)統計了(le),呵(he)呵(he)
SELECT sum(totalfee) FROM (SELECT ROW_NUMBER() OVER ( ORDER BY a.orderid ) AS row ,* FROM dbo.Order_Info_View AS a where CONVERT(CHAR(7),a.buytime,20)='2010-04'and a.agentid=3455) AS b WHERE b.row BETWEEN 1 AND 20