• SqlServer分页


    前言

    最近开始接触sqlserver数据库,由于之前一直使用的是mysql的数据库,所以很多不太明白的地方,特此记录下。

    正文

    1. SqlServer的分页(sqlserver2008)

    方法一:select top n  from 。。。 where id not in (select top m from 。。)的方法。(效率一般,多表查询代码复杂。)

    方法解释: 假设要查询第5页,每页10条数据,那么就是要查询第40-50条数据。那么我们可以查询id不在 前40条数据的id中的数据,然后去top 10条数据即可。

    SELECT top 10 * FROM t_user WHERE ID NOT IN (SELECT TOP 50 ID FROM t_user);

    总计显示的是:第51-60条数据。

    需要注意的是:

    1. 本方法要求所查询的表必须要主键或者表示唯一性的列,如果没有,则不能使用。

    2. 本方法不会出现最后一页不足每页大小的时候自动补足的情况。也就是说,当你查询到倒数第二页的时候,如果最后一页不足要求总条数,则会显示剩余条数。比如要求10条每页,最后一页只有8条,则显示8条。

    方法二: select * from (select top 10 * from (select top 20 * from user order by time desc)  a order by a.time  ) b  order by b.time desc;(效率略低,多表查询代码简洁。并且需要处理最后一页数据。)

    (作者注:由于本次查询我使用的是三表联查的方法进行的查询并且还要分页,并且没有唯一列,如果要使用别的方法,那么我只能把三表查询作为一个中间表来使用了。但是那样的话代码量会比较大,所以选择了这种方法。)

    方法解释:要查询第5页,也就是40-50的数据,我先倒序查询出50条,然后正序排列,拿前面10条,也就是需要的40-50条数据。如果需要倒序排列,则重新在查询一下结果,倒序排列即可。如果你不需要倒序排列,则可以直接正序查询前50条数据,然后把数据倒序排列,那前10条就是所需要的数据。

    SELECT * FROM (
        SELECT top 10 * FROM (
            SELECT TOP 50 tdhv.* 
            FROM T_XXXXX tdhv
            ORDER BY tdhv.CHECK_TIME DESC) a 
        ORDER BY a.check_time ) b 
    ORDER BY b.check_time DESC

    结果如下:

    此表并没有id,但是依旧可以进行分页。

    需要特别注意的是:当你最后一页不足所需的每页数量的时候(假设每页10条,最后一页剩余8条),如果用这种方法查询的话,会得到10条数据,最后有两条是重复的!!因为你倒序取的是10条,所以这里必须在程序里面进行处理!

    我是这么处理的:每次查询的时候判断当前页码乘以每页条数跟总记录数之间差值,如果大于总记录数,那么表示最后一页不足每页记录的条数。这时候就需要调整你要查询的记录条数了

    查询条数为: 总记录数 - (当前页码-1)* 每页条数,得到还剩余多少条记录。

    查询总条数为: 总记录数。

    这里需要对数据进行判断。

    方法三:查询到需要行数据的id,然后使用内连接,再次查询这些id对应的列的其它的值。(效率挺高,单表查询方便,多表代码量会很大。并且要自定义处理最后一页数据。)

    SELECT * FROM XXXX,
    (SELECT TOP 10 ID FROM (SELECT TOP 20 ID FROM XXXX ORDER BY XXXX.ID ASC) a ORDER BY a.ID DESC) b
    WHERE XXXX.ID = b.ID;

    结果就不展示了,展示的还是10条,但是需要注意的也是:最后一页的数据必须自定义才能查询,否则会造成查询到的数据多。

    并且:因为是使用的内连接,还可以使用 in(ids)的方法进行解决,效率应该也可以。原理是一样的,先查询id,然后根据id查询所有结果。


    2018-07-25更新

    方法四:使用rownum来进行统计并查询分页

    没有进行分页(左图)

    SELECT 
        tbl_unit.ID,tbl_unit.NAME,
        ROW_NUMBER () OVER (ORDER BY tbl_unit.ID DESC) AS rowNum
    FROM
    tbl_unit

    进行分页:取前五条记录(右图)

    SELECT * FROM (
    SELECT 
        tbl_unit.ID,tbl_unit.NAME,
        ROW_NUMBER () OVER (ORDER BY tbl_unit.ID DESC) AS rowNum
    FROM
    tbl_unit) b WHERE b.rowNum BETWEEN 1 and 5 

    代码简单,使用rowNum进行统计总数量。并使用between。。and来获取。也可以使用 rowNum >= 1  and rowNum <= 5


     2. SqlServer的分页(sqlserver 2012之后)

    sqlserver在2012之后有了新的分页方法: OFFSET 开始的条数  ROW FETCH NEXT 取多少条数据 ROWS ONLY;类似于mysql的limit分页方法(由于作者未安装2012版本sqlserver,所以此条未经作者测试

    select id from a Order by id Offset 0 Row Fetch Next 5 Rows Only.

    需要注意的是:这种方法支持SQLServer2012,但是SQLServer2008不支持!!

    本条参考: https://blog.csdn.net/zhoukun1008/article/details/52910436 

  • 相关阅读:
    select 的readonly效果
    HTML5与CSS3设计模式
    关于htons和htonl
    Http Range
    如何隐藏aspx文件格式,变成html
    UITableView的cell 自定义 高度,样式
    gson 数据里面设置特殊字符不转换为十六进制
    HDU2164:Rock, Paper, or Scissors?
    黑马程序员java基础学习网络编程2
    HDU2137:circumgyrate the string
  • 原文地址:https://www.cnblogs.com/chenmc/p/9262796.html
Copyright © 2020-2023  润新知