04.關於SqlServer查詢,數據較多時分頁查詢同時獲取總條數


在做的這個項目要做一個查詢相關信息的功能,查詢的Sql找到后,去SqlServer查了一下,發現有幾千條數據

然后想到以前用的一個 limit 來做分頁查詢,發現 limit 是MySql里面的,SqlServer里面沒有

然后就去網上搜了下關於SqlServer分頁查詢的知識,找了幾個文章看了一下,好像都是嵌套查詢來做的

然后選了一個文章,按照里面的方法去試一下,原文:高效的SQLSERVER分頁查詢 

這里我選了第五種方法去試了下

SELECT w2.n, w1.* FROM ARTICLE w1, 
 (SELECT TOP 50030 row_number() OVER (ORDER BY YEAR DESC, ID DESC) n, ID FROM ARTICLE ) w2
WHERE w1.ID = w2.ID AND w2.n > 50000 ORDER BY w2.n ASC 

發現了一個之前沒有見過的 row_number() 函數,然后查了一下,大致就是對查詢的結果重新進行一個編號

想要了解更多,可以點擊這里 ROW_NUMBER 

然后我在本地新建了一個測試用的數據表,改了一下Sql查詢

SELECT w2.n, w1.* FROM users w1, 
(SELECT TOP 20 row_number() OVER (ORDER BY  ID) n, ID FROM users ) w2 
WHERE w1.ID = w2.ID AND w2.n > 10 ORDER BY w2.n ASC;

其中id是表的主鍵,n是row_number()重新生成的編號值,因為按照id排序的,所以和id一樣

這條Sql是查詢第11條到20條的數據,w2取的就是按照id排序的前20條結果(這里w2的內容是 n, ID)

其中id與w1原表連接查詢,按照w2.n排序,從n > 10也就是11條開始取值

結果就是,按照ID排序,取前20條數據,從第11條開始,完成取第11到20條數據

理解了以后,那么改動一下數字,就可以完成從x條到y條的查詢,然后重新改了一下

declare @size int set @size=10
declare @page int set @page=2

SELECT w2.n, w1.* FROM users w1, 
(SELECT TOP (@size*@page) row_number() OVER (ORDER BY  ID DESC) n, ID FROM users ) w2 
WHERE w1.ID = w2.ID AND w2.n > ((@page-1) * @size) ORDER BY w2.n ASC;

聲明每頁條數和當前頁,(2*10)  即查詢前20條數據,n > ((2-1)*10=10) 即第11條開始,查詢結果如下(改了按照id降序)

這樣就可通過賦值給變量@size 和 @page 來控制查詢

然后修改好以后,前端也可以顯示了,然后又遇到一個問題就是不知道一共有多少條數據

然后又去查了一下,看到一篇文章有兩種方法,原文:SQL Server 怎么在分頁獲取數據的同時獲取到總記錄數 

1.先分頁獲取數據,然后再查詢一遍數據庫獲取到總數量

2.使用count(1) over()獲取總記錄數量

然后選了第二種方法,雖然會有一整列的總條數,但不用再查詢一遍數據庫了,然后放在內層查詢中,如下

declare @size int set @size=10
declare @page int set @page=1

SELECT w2.allcount,w2.n, w1.* FROM users w1, 
(SELECT TOP (@size*@page) row_number() OVER (ORDER BY  ID DESC) n, 
    ID,COUNT(1) OVER() AS allcount FROM users ) w2 
WHERE w1.ID = w2.ID AND w2.n > ((@page-1) * @size) ORDER BY w2.n ASC;

至此,分頁查詢和總條數查詢都完成了

又學到了新知識,今天又是元氣滿滿的一天鴨


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM