在做的这个项目要做一个查询相关信息的功能,查询的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;
至此,分页查询和总条数查询都完成了
又学到了新知识,今天又是元气满满的一天鸭