在做的這個項目要做一個查詢相關信息的功能,查詢的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;
至此,分頁查詢和總條數查詢都完成了
又學到了新知識,今天又是元氣滿滿的一天鴨