当前位置:  数据库>oracle

SQL分页排序的实现与分页数据重复问题——以Oracle rownum为例

    来源: 互联网  发布时间:2017-03-29

    本文导语: 对于关系数据库来说,直接写SQL拉数据在列表中显示是很常用的做法。但如此便带来一个问题:当数据量大到一定程度时,系统内存迟早会耗光。另外,网络传输也是问题。如果有1000万条数据,用户想看最后一条,这时即便有...

对于关系数据库来说,直接写SQL拉数据在列表中显示是很常用的做法。但如此便带来一个问题:当数据量大到一定程度时,系统内存迟早会耗光。另外,网络传输也是问题。如果有1000万条数据,用户想看最后一条,这时即便有足够的内存,在网络上传输这么多数据也得一两小时吧,恐怕没几个用户有这么耐心等。因此分页是必须的。

现在网上的论坛、博客什么的,基本上都会有分页功能,有些是SQL分页的,有些可能是NOSQL用其它方法分页,都有很成熟的东西了。本文根据我自己的经验,以Oracle为例,讲下简单的SQL分页和排序问题,对刚接触SQL准备要做分页的人有些帮助吧,大牛们就不必看了。

假设ORALCE数据库中有一个TAB001表,主键为ID,有1000万条记录,索引什么的都有了。我们有一个需求,是在界面上列出指定条件的记录,原始SQL如下:

select ID,NAME,ATYPE,CREATEDATE,CREATOR,ASTATUS from TAB001 where ATYPE='SOME_TYPE'

如果要排序,比如要按CREATOR倒排序,我们会在SQL后面再加一句:order by CREATEOR desc

现在,我们发现这个SQL下来有500万条记录,显然,如果不分页,系统很容易就会翘掉。于是我们准备分页。

分页前,我们可能要在界面上摆上几个按钮和状态显示:上一页、下一页、第一页、最后页、每页X条、共M页、当前第N页、跳到第N页,等。显然,我们分页的步骤如下:

计算总记录数;
根据总记录数和每页记录数,计算总页数;
根据当前要显示的页码,计算起始和结束的记录号;
生成分页SQL,执行之,返回本页数据,显示之。
首先,计算总记录数。这个简单,嵌套一个select count(*)就行了:



select count(*)
  from (
             select ID,NAME,ATYPE,CREATEDATE,CREATOR,ASTATUS from TAB001 where ATYPE='SOME_TYPE'
          ) xx
 
然后,总页数=ceil(总记录数/每页记录数),不足一页也当一页处理。




接着,假设现在是第N页,则本页的开始、结束记录号为:

  开始记录号=N*每页记录数

  结束记录号=min((N+1)*每页记录数-1,总记录数)

最后,生成分页SQL。由于分页需要有记录号,因此先要嵌套一个子查询生成ROWNUM:

select rownum as recordno
  from (
             select ID,NAME,ATYPE,CREATEDATE,CREATOR,ASTATUS from TAB001 where ATYPE='SOME_TYPE'
          ) xx
 
这样,我们就有了记录号,可以再对记录号进行过滤,只选出本页开始记录号之后、结束记录号之前的记录:




select xxx.*
  from (
            select rownum as recordno
              from (
                         select ID,NAME,ATYPE,CREATEDATE,CREATOR,ASTATUS from TAB001 where ATYPE='SOME_TYPE'
                      ) xx
           ) xxx
where recordno >= :开始记录号
    and recordno


    
 
 

您可能感兴趣的文章:

  • 数据库查询排序使用随机排序结果示例(Oracle/MySQL/MS SQL Server)
  • SQL分组排序去除重复实例
  • 有关sql server的排序问题
  • Oracle 中文字段进行排序的sql语句
  • 大家讨论一下EJB QL的功能,和标准SQL相比,缺少什么功能?比如排序功能等。
  • sql分组查询(按组内个数排序)
  • SQL-ORDER BY 多字段排序(升序、降序)
  • SQL分组排序去重复的小实例
  • sql查询表中根据某列排序的任意行语句
  • sql server分组排序之row_number()over函数的使用
  • IT科技资讯 iis7站长之家
  • 在sql中不指定Order by排序是按照主键吗
  • sql Server使用ROW_NUMBER时不排序的实例代码
  • sql多条件多字段排序(图文教程)
  • sql语句获取分组排序后数据
  • sql union查询与排序的例子
  • SQL字符型字段按数字型字段排序实现方法
  • sql语句排序子句order by用法实例
  • sql获取分组排序后数据的脚本
  • sql server分组查询与排序的例子
  • 如何实现连接一次数据库,提交多个sql语句。(sql的批处理)
  • 我想把csdn的论坛改成一个软件平台,另外增加数据查询功能,聊天功能,不知怎样实现比较好?我想用jbuider 7+SQL server实现,不知如何?
  • SQL语句实现SQL Server 2000及Sql Server 2005日志收缩(批量)
  • SQL Server设置主键自增长列(使用sql语句实现)
  • 如何实现DOS下用Turbo C 连接SQL Server 7?
  • 在SQL server 2000中用JAVA实现图片存储
  • 如何实现用jsp将sql server 的数据备份出来!并指定存放路径!
  • 如何实现图片上传啊,而且我想把它记录在SQL SERVER中!!有空请帮我!!!
  • 用oracle pl/sql 从A unix机器,去读取B unix机器上的一个文件,怎么实现?
  • 用SQL语句实现替换字符串
  • 请问在 Linux 下如何用代码实现连接oracle数据库 并 执行 SQL 语句?
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • SQL Server 2008如何进行数据库分离和附加详细介绍
  • sql server 删除表1某些数据的同时自动删除表2的相关数据的sql代码
  • 取数据库前几条数据(sql server、oracle、mysql)的sql写法
  • 查询SQL Server中所有数据库的数据文件位置的sql脚本
  • SQL Server数据库的修复SQL语句
  • 使用php语句将数据库*.sql文件导入数据库
  • sql2005 大数据量检索分页的sql代码
  • t-sql/mssql用命令行导入数据脚本的SQL语句示例
  • 请问Linux数据库编程是否也可以支持通用的SQL语言进行数据库编写.
  • jsp jdbc为什麽不能把数据insert到sql server 中,也不能从sql server中提取数据?!
  • sql数据库如何查询修改数据库恢复模式?
  • sql添加数据后返回受影响行数据
  • sql语句获取数据库服务器上所有数据库的名字
  • sql 语句 取数据库服务器上所有数据库的名字
  • Access 数据类型与 MS SQL 数据类型的相应
  • linux下能调用*.sql备份的数据库数据么?
  • sql数据库多用户模式修改方法
  • sql server 2005删除用户时“数据库主体在该数据库中拥有架构,无法删除”错误的解决办法
  • sql数据库修改数据库用户
  • 数据库前端 SQL Workbench-J
  • Oracle 数据库开发工具 Oracle SQL Developer
  • java命名空间java.sql接口statement的类成员方法: executeupdate定义及介绍
  • 请问,这是什么错误!java.sql.SQLException: [Microsoft][ODBC SQL Server Driver][Named Pipes]??????? SQL Server?虽然分少,但一定给,只要您是前5名回复者中最好的以为!
  • java命名空间java.sql接口connection的类成员方法: nativesql定义及介绍
  • SQL查询分析工具 SQL Workbench/J
  • java命名空间java.sql接口preparedstatement的类成员方法: executeupdate定义及介绍
  • oracle导出sql语句的结果集和保存执行的sql语句(深入分析)
  • java命名空间java.sql接口rowid的类成员方法: getbytes定义及介绍
  • SQL Server统计SQL语句执行时间的脚本
  • java命名空间java.sql接口ref的类成员方法: getbasetypename定义及介绍
  • SQL客户端软件 PKLite SQL Client


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3