`

oracle中如何实现类似MSSQL中Select top N语句

阅读更多
引用
oracle中如何实现类似MSSQL中Select top N语句,以实现从结果中抽出相应的数据



oracle top n(源:http://huibin.iteye.com/blog/419780)

1.在ORACLE中实现SELECT TOP N
   由于ORACLE不支持SELECT TOP语句,所以在ORACLE中经常是用ORDER BY跟ROWNUM的组合来实现SELECT TOP N的查询。

简单地说,实现方法如下所示:

   
  SELECT 列名1...列名n FROM 

        (SELECT 列名1...列名n FROM 表名 ORDER BY 列名1...列名n) 

       WHERE ROWNUM <= N(抽出记录数) 

      ORDER BY ROWNUM ASC 

   下面举个例子简单说明一下。

顾客表customer(id,name)有如下数据:

    
 ID NAME 

       01 first 

       02 Second 

       03 third 

       04 forth 

       05 fifth 

       06 sixth 

       07 seventh 

       08 eighth 

       09 ninth 

       10 tenth 

       11 last 

   则按NAME的字母顺抽出前三个顾客的SQL语句如下所示:

   
  SELECT * FROM 

        (SELECT * FROM CUSTOMER ORDER BY NAME) 

       WHERE ROWNUM <= 3 

       ORDER BY ROWNUM ASC 

   输出结果为:

      ID NAME

       08 eighth

       05 fifth

       01 first

2.在TOP N纪录中抽出第M(M <= N)条记录

在得到了TOP N的数据之后,为了抽出这N条记录中的第M条记录,我们可以考虑从ROWNUM着手。我们知道,ROWNUM是记录表中数据编号的一个隐藏子段,所以可以在得到TOP N条记录的时候同时抽出记录的ROWNUM,然后再从这N条记录中抽取记录编号为M的记录,即使我们希望得到的结果。

从上面的分析可以很容易得到下面的SQL语句。
引用

      SELECT 列名1...列名n FROM

         (

         SELECT ROWNUM RECNO, 列名1...列名nFROM

           (SELECT 列名1...列名n FROM 表名 ORDER BY 列名1...列名n)

         WHERE ROWNUM <= N(抽出记录数)

       ORDER BY ROWNUM ASC

         )

       WHERE RECNO = M(M <= N)


同样以上表的数据为基础,那么得到以NAME的字母顺排序的第二个顾客的信息的SQL语句应该这样写:

    
  SELECT ID, NAME FROM 

         ( 

          SELECT ROWNUM RECNO, ID, NAME FROM 

            (SELECT * FROM CUSTOMER ORDER BY NAME) 

             WHERE ROWNUM <= 3 

             ORDER BY ROWNUM ASC ) 

           WHERE RECNO = 2 
  

  结果则为:

       ID NAME

        05 fifth

3.抽出按某种方式排序的记录集中的第N条记录

   在2的说明中,当M = N的时候,即为我们的标题讲的结果。实际上,2的做法在里面N>M的部分的数据是基本上不会用到的,我们仅仅是为了说明方便而采用。

   如上所述,则SQL语句应为:
引用

       SELECT 列名1...列名n FROM

         (

          SELECT ROWNUM RECNO, 列名1...列名nFROM

            (SELECT 列名1...列名n FROM 表名 ORDER BY 列名1...列名n)

             WHERE ROWNUM <= N(抽出记录数)

          ORDER BY ROWNUM ASC

         )

         WHERE RECNO = N

     那么,2中的例子的SQL语句则为:
        SELECT ID, NAME FROM 

          ( 

           SELECT ROWNUM RECNO, ID, NAME FROM 

             (SELECT * FROM CUSTOMER ORDER BY NAME) 

           WHERE ROWNUM <= 2 

           ORDER BY ROWNUM ASC 

          ) 

          WHERE RECNO = 2 

     结果为:

       ID NAME

        05 fifth

4.抽出按某种方式排序的记录集中的第M条记录开始的X条记录

       3里所讲得仅仅是抽取一条记录的情况,当我们需要抽取多条记录的时候,此时在2中的N的取值应该是在N >= (M + X - 1)这个范围内,当让最经济的取值就是取等好的时候了的时候了。当然最后的抽取条件也不是RECNO = N了,应该是RECNO BETWEEN M AND (M + X - 1)了,所以随之而来的SQL语句则为:

     
引用
SELECT 列名1...列名n FROM

        (

         SELECT ROWNUM RECNO, 列名1...列名nFROM

          (

          SELECT 列名1...列名n FROM 表名 ORDER BY 列名1...列名n)

          WHERE ROWNUM <= N (N >= (M + X - 1))

        ORDER BY ROWNUM ASC

          )

         WHERE RECNO BETWEEN M AND (M + X - 1)

    同样以上面的数据为例,则抽取NAME的字母顺的第2条记录开始的3条记录的SQL语句为:

    
  SELECT ID, NAME FROM 

         ( 

          SELECT ROWNUM RECNO, ID, NAME FROM 

            (SELECT * FROM CUSTOMER ORDER BY NAME) 

          WHERE ROWNUM <= (2 + 3 - 1) 

          ORDER BY ROWNUM ASC 

         ) 

         WHERE RECNO BETWEEN 2 AND (2 + 3 - 1) 
     结果如下:

       ID NAME

        05 fifth

        01 first

        04 forth

    以此为基础,再扩展的话,做成存储过程,将开始记录数以及抽取记录数为参数,就可以轻松实现分页抽取数据。
分享到:
评论

相关推荐

    经典SQL语句大全

    22、说明:列示type、vender、pcs字段,以type字段排列,case可以方便地实现多重选择,类似select 中的case。 select type,sum(case vender when 'A' then pcs else 0 end),sum(case vender when 'C' then pcs else ...

    php mssql 数据库分页SQL语句

    把常见数据库Sql Server,Oracle和MySQL的分页语句,从数据库表中的第M条数据开始取N条记录的语句总结如下: SQL Server 从数据库表中的第M条记录开始取N条记录,利用Top关键字:注意如果Select语句中既有top,...

    oracle学习文档 笔记 全面 深刻 详细 通俗易懂 doc word格式 清晰 连接字符串

    其二、技术层次深:如果期望进入IT服务或者产品公司(类似毕博、DELL、IBM等),Oracle技术能够帮助提高就业的深度。 其三、职业方向多:Oracle数据库管理方向、Oracle开发及系统架构方向、Oracle数据建模数据仓库等...

    数据库操作语句大全(sql)

    22、说明:列示type、vender、pcs字段,以type字段排列,case可以方便地实现多重选择,类似select 中的case。 select type,sum(case vender when 'A' then pcs else 0 end),sum(case vender when 'C' then pcs else ...

    .NET DbHelper 数据访问类(MSSQL Mysql ORACLE)

    个人曾经写过的数据访问接口,包含:MSSQL、Mysql、Oracle等数据库的公共处理接口。可以拿过来直接使用,放在手里好多年了。 IDatabase接口声明如下: namespace Simple.Database { /// /// IDatabase 接口 /// ...

    经典全面的SQL语句大全

     22、说明:列示type、vender、pcs字段,以type字段排列,case可以方便地实现多重选择,类似select 中的case。 select type,sum(case vender when 'A' then pcs else 0 end),sum(case vender when 'C' then pcs ...

    sql经典语句一部分

    22、说明:列示type、vender、pcs字段,以type字段排列,case可以方便地实现多重选择,类似select 中的case。 select type,sum(case vender when 'A' then pcs else 0 end),sum(case vender when 'C' then pcs else ...

    精通sql结构化查询语句

    SQL查询篇第6章 简单的SELECT语句查询 6.1 查询的基本结构 6.1.1 了解SELECT语句 6.1.2 SELECT语句的语法格式 6.1.3 SELECT语句的执行步骤 6.2 简单的查询语句 6.2.1 查询表中指定的字段 6.2.2 查询所有的字段 6.2.3...

    oracle导出sql语句的结果集和保存执行的sql语句(深入分析)

    您可能感兴趣的文章:MySQL中在查询结果集中得到记录行号的方法PHP调用MsSQL Server 2012存储过程获取多结果集(包含output参数)的详解sql 查询记录数结果集某个区间内记录JavaWeb dbutils执行sql命令并遍历结

    万能数据库备份

    Select SQL语句n } 6).恢复时可以浏览备份数据。 7).有外键约束时注意恢复顺序。 8).可以自定义恢复,如恢复哪些数据备份文件;;;;;;;;;;;;;;;;PARADOX在备份时无.DB扩展名,恢复时须加上.DB。 技术支持: ...

    SQL数据库资源大放送

    下列语句部分是Mssql语句,不可以在access中使用。 SQL分类: DDL—数据定义语言(CREATE,ALTER,DROP,DECLARE) DML—数据操纵语言(SELECT,DELETE,UPDATE,INSERT) DCL—数据控制语言(GRANT,REVOKE,COMMIT...

    某知名公司内部ORACLE培训资料(如果你看后觉得不行,可以损我,人格担保)

    某知名公司内部ORACLE培训资料,绝对不可多得。 如果你下载后觉得不行,可以损我。 一、基础 1、说明:创建数据库 CREATE DATABASE database-name 2、说明:删除数据库 drop database dbname 3、说明:备份sql ...

    asp.net知识库

    存储过程中实现类似split功能(charindex) 通过查询系统表得到纵向的表结构 将数据库表中的数据生成Insert脚本的存储过程!!! 2分法-通用存储过程分页(top max模式)版本(性能相对之前的not in版本极大提高) 分页存储...

    PHP开发实战1200例(第1卷).(清华出版.潘凯华.刘中华).part1

    实例173 实现复选框中的全选、反选和不选 208 实例174 隐藏域提交用户的ID值 210 实例175 图像域替代提交按钮 211 实例176 跳转菜单实现页面跳转 213 实例177 上传图片预览 214 实例178 去掉下拉选项的边框 215 实例...

    PHP开发实战1200例(第1卷).(清华出版.潘凯华.刘中华).part2

    实例173 实现复选框中的全选、反选和不选 208 实例174 隐藏域提交用户的ID值 210 实例175 图像域替代提交按钮 211 实例176 跳转菜单实现页面跳转 213 实例177 上传图片预览 214 实例178 去掉下拉选项的边框 215 实例...

    haivDb4J2ee1.3

    它是基于java编写的j2ee代码自动生成工具暨数据库管理工具,运行于jdk1.5环境中,目前版本支持Oracle、mysql、mssql三种常用的数据库,以后会视情况扩充至其它种类的关系型数据库。它的功能类似于MyEclipse的自动...

    HaivOra4J2ee工具提供图片

    开发工具HaivDb4J2ee,全称Haiv Database Tool for J2EE,是基于java编写的j2ee代码自动生成工具暨数据库管理工具,运行于jdk1.5环境中,目前版本支持Oracle、mysql、mssql三种常用的数据库,以后会视情况扩充至其它...

    php网络开发完全手册

    11.1.6 下拉框与列表框标签select 172 11.2 表单数据的接收 173 11.2.1 GET方法 173 11.2.2 POST方法 176 11.3 常用表单数据的验证方法 177 11.3.1 姓名验证 177 11.3.2 日期验证 177 11.3.3 E-mail地址验证 178 ...

    支持多数据库的ORM框架ef-orm.zip

    例如:数据库查询条件的传入问题是所有ORM框架都不能回避的一个问题,所以我经常在想——既然我们可以用向DAO传入一个Entity来实现插入操作,为什么就不能用同样的方法来描述一个不以主键为条件的update/select/...

Global site tag (gtag.js) - Google Analytics