sqlserver分页查询处理方法小结

 更新时间:2017年07月31日 17:23:15   转载 作者:shmily_sanyan  
下面是本人在网上查阅到的几种查询脚本的写法特此分享到脚本之家平台,供大家参考

sqlserver2008不支持关键字limit ,所以它的分页sql查询语句将不能用MySQL的方式进行,幸好sqlserver2008提供了top,rownumber等关键字,这样就能通过这几个关键字实现分页。

下面是本人在网上查阅到的几种查询脚本的写法:

几种sqlserver2008高效分页sql查询语句

top方案:

sql code:

select top 10 * from table1
where id not in(select top 开始的位置 id from table1)

max:

sql code:

select top 10 * from table1
where id>(select max(id)
from (select top 开始位置 id from table1 order by id)tt)

row:

sql code:

select *
from (
select row_number()over(order by tempcolumn)temprownumber,*
from (select top 开始位置+10 tempcolumn=0,* from table1)t
)tt
where temprownumber>开始位置

3种分页方式,分别是max方案,top方案,row方案

效率:

第1:row

第2:max

第3:top

缺点:

max:必须用户编写复杂sql,不支持非唯一列排序

top:必须用户编写复杂sql,不支持复合主键

row:不支持sqlserver2000

测试数据:

共320万条数据,每页显示10条数据,分别测试了2万页、15万页和32万页。

页码,top方案,max方案,row方案

2万,60ms,46ms,33ms
15万,453ms,343ms,310ms
32万,953ms,720ms,686ms

是一种通过程序拼接sql语句的分页方案,

用户提过的sql语句不需要编写复杂的sql逻辑

诺用户提供sql如下

sql code

select * from table1

从第5条开始,查询5条,处理后sql变为

sql code

select *
from (
select row_number()over(order by tempcolumn)temprownumber,*
from (select top 10 tempcolumn=0,* from table1)t
)tt
where temprownumber>5

这是什么意思呢?分解一下

首先将用户输入的sql语句转稍稍修改

在select后添加top 开始位置+条数变成

再外加一列tempcolum,变成这样

sql code

select top 20 tempcolumn=0,* from clazz

嵌套一层,这样便可查询出行号

刚才那个列就是用来这里order by用的

(也不知道sqlserver的row_number函数为什么必须要order by)

sql code

select row_number()over(order by tempcolumn)temprownumber,*
from (修改过的查询)t

再套一层,过滤掉行号小于开始位置的行

sql code

select * from (第二层)tt
where temprownumber>10

总结

以上所述是小编给大家介绍的sqlserver分页查询处理方法小结,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

相关文章

  • Oracle 10g各个帐号的访问权限、登录路径、监控状态命令查询等等

    Oracle 10g各个帐号的访问权限、登录路径、监控状态命令查询等等

    各个帐号的访问权限、登录路径、监控状态命令查询等等
    2009-05-05
  • SQL SERVER 触发器介绍

    SQL SERVER 触发器介绍

    触发器是一种特殊类型的存储过程,它不同于之前的我们介绍的存储过程。触发器主要是通过事件进行触发被自动调用执行的。而存储过程可以通过存储过程的名称被调用。
    2013-03-03
  • 用非动态SQL Server SQL语句来对动态查询进行执行

    用非动态SQL Server SQL语句来对动态查询进行执行

    此文章主要向大家讲述的是非动态SQL ServerSQL语句执行动态查询,在实际操作中我尝试在一个存储过程中,来进行传递一系列以逗号划定界限的值,来对结果集进行限制。但是无论什么时候,我在IN子句中使用变量,都会得到错误信息
    2017-06-06
  • 如何开启SqlServer 远程访问

    如何开启SqlServer 远程访问

    这篇文章主要介绍了如何开启SqlServer 远程访问,本文图文并茂给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-11-11
  • sql server中查找特定类别的列的写法

    sql server中查找特定类别的列的写法

    要对特定类别的列进行一些操作,写了以下的一段代码,比较方便检查数据库内同一类别的所有列,示例用来查所有nvarchar的列
    2013-02-02
  • SQL Server代理服务无法启动怎么办

    SQL Server代理服务无法启动怎么办

    SQL Server代理服务无法启动怎么办?这篇文章主要介绍了SQL Server代理服务无法启动的解决方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-03-03
  • 你真的了解触发器么 数据实时同步更新问题剖析

    你真的了解触发器么 数据实时同步更新问题剖析

    触发器就是我们想要的神器了。我们可以在那张动态表上新建触发器。触发器的实质就是个存储过程,只不过他调用的时间是根据所建的动态表发生该表而执行(即:Insert新数据,Update或者Delete数据)具体怎么使用触发器,今天我这里就不介绍了
    2013-01-01
  • Sql学习第三天——SQL 关于with ties介绍

    Sql学习第三天——SQL 关于with ties介绍

    with ties一般是和Top , order by相结合使用的,会查询出最后一条数据额外的返回值,接下来将为大家详细介绍下,感兴趣的各位可以参考下哈
    2013-03-03
  • 真正高效的SQLSERVER分页查询(多种方案)

    真正高效的SQLSERVER分页查询(多种方案)

    Sqlserver数据库分页查询一直是Sqlserver的短板,分页查询每页30条,查询第1500页(即第45001-45030条数据)进行测试,分析出最高效的查询,感兴趣的朋友可以参考下哈
    2013-04-04
  • sql server中随机函数NewID()和Rand()

    sql server中随机函数NewID()和Rand()

    在SQL语言中,随机函数NEWID和rand()用法并不相同,下面就将为您示例分析这两个随机函数的区别,供您参考,希望对您深入理解SQL函数能起到作用
    2015-10-10

最新评论