最近项目中用到了SQL Server2014数据库,因为是采用MyBatis框架,所以能够编写sql语句,发现代码里面同事对于分页查询采用了两种方式,可能是不同的人编写的。第一种是rowNumber的方式,第二种是采用的SQL Server语法 OFFSET/FETCH,开始我也没做区别,就采用了比较简单的后一种,原来的方式也没有去动它。
后来出问题了,测试说分页有重复数据出现,这才倒过来查找,发现都是rownumber的地方分页出现问题;其实如果单纯的分页时没有问题的,但是项目中如果要求按照不同的属性来降序或者升序分页的话就出问题了。
问题:如下代码所示,采用rownumber分页,依据id来升序排序。如果要求按照时间降序的话,则不能在子查询里面添加order by语句了,或报错。
select top ${length} *
from
(
SELECT row_number() over(order by id) as rownumber,
t.id AS id,