SQL Server中分页查询和排序问题

数据库 同时被 2 个专栏收录
2 篇文章 0 订阅
1 篇文章 0 订阅

最近项目中用到了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,
                       t.company_code AS companyCode,
                       t.company_name AS companyName,
                       t.state AS state,
                       t.support_expenses AS supportExpenses
                   FROM
                       Payors t
                   where 1=1
                   //ORDER BY t.entry_date DESC     //在此不能使用order by来排序
             ) A
where rownumber > ${start}
//ORDER BY t.entry_date DESC      //在此也不能使用order by来排序,因为逻辑不对,会导致重复数据

解决:

1. sql server在2012版本后推出了OFFSET/FETCH/NEXT语法来分页,查阅了很多文档和与rownumber的比较,效率很高,所以完全可以代替rownumber方式。而且写法也比较简单,一句话搞定。
SELECT
     t.id AS id,
     t.company_code AS companyCode,
     t.company_name AS companyName,
     t.state AS state,
     t.support_expenses AS supportExpenses
FROM
     Payors t
WHERE 1=1        
ORDER BY t.entry_date DESC
**OFFSET #{start} ROW FETCH NEXT #{length} ROWS ONLY**     //start表示开始序号,length表示查询长度

2.难道rownumber就不能用时间排序了吗?其实也可以。将row_number() over(order by id) as rownumber这句话中的order by id 换成order by time desc就可以了.就算时间有重复也不用担心,他照样能够排序查询出来,至于那他到底根据什么来排列时间相同的就不得而知了。关于效率问题,还是推荐用上一种方法了。
SELECT TOP ${length} *
       FROM(
            SELECT  
                 row_number() over(**ORDER BY t.enty_time DESC**) as rownumber,
                 t.id AS id,
                 t.company_code AS companyCode,
                 t.company_name AS companyName,
                 t.state AS state,
                 t.support_expenses AS supportExpenses
             FROM
                 Payors t
             WHERE 1=1
         ) A
WHERE rownumber > ${start}

总结:
总结:没怎么用过sql server ,对他的分页方式也不是很了解,只是在项目中遇到的小问题,就当是一个工作总结吧。有什么见解和意见,欢迎讨论。

  • 0
    点赞
  • 1
    评论
  • 1
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值