网站首页
JSP空间
动态资讯
开源项目
技术文档
资源下载
J2EE资源
客户论坛
在线支付
 
  技术文档>>数据库技术>>Oracle技术>>Oracle开发>查看文档  
  教你在Oracle中实现SELECT TOP N的方法     
  文章作者:未知  文章来源:未知  
  查看:130次  录入:管理员--2007-06-03  
 

本文通过举例的方式来教你如何在Oracle中实现SELECT TOP N的方法。

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的时候,即为我们的标题第三点所讲的结果。实际上,第二点的做法在里面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条记录:

上一点所讲的仅仅是抽取一条记录的情况,当我们需要抽取多条记录的时候,此时在第二点中的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的字母顺的第二条记录开始的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

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

 
 
上一篇: Oracle数据库SPFILE文件特点及具体操作    下一篇: Oracle是波音747还是MySQL丰田汽车呢?
  相关文档
轻松四步帮你解决不能一次创建多表问题 06-17
深入讲解oracle9i数据仓库的增强及其价值 01-28
oracle数据库中如何对时间格式进行处理 03-19
sql语句格式化数字(前面补0)的参考示例 07-01
深入讲解redo log file损坏的处理过程 (1) 03-07
在oracle中添加用户 赋权 修改密码 解锁 05-29
在aix平台上监视cpu并实时获得sql语句 03-06
详细介绍Oracle 8i中怎样实现实时通信 04-12
oracle数据库中获取固定记录数的实用方法 04-15
有关Oracle中虚拟专用数据库的探讨 04-11
如何使用 10203事件 跟踪 oracle块清除 11-20
从自动备份中恢复控制文件和spfile文件 11-22
菜鸟学Oracle - 用PL/SQL画直方图 05-27
实例讲解oracle到sql server主键的迁移 05-14
实例讲解如何删除oracle 10g的垃圾表 03-28
oracle数据库中关于"null"排序的问题 01-25
初学者必读:行连接和行迁移的不同之处 07-30
了解oracle体系结构前必须掌握的两个概念 (1) 04-23
用forall与bulk collect快速复制表数据 (1) 03-27
实例讲解更改oracle数据库中的sys口令 07-30
返回首页 | 关于我们 | J网章程 | JSP空间合租 | 客服中心 | 免责声明 | 常见问题 | 参观机房
本站主机空间代理至厦门市华众网络科技有限公司
《中华人民共和国增值电信业务经营许可证》
编号:闽B2-20050079
@2005-2008福建JSP技术网 版权所有 闽ICP备05000928号
厦门(总部):13616026886 福州:0591-87655121
邮箱:admin@fjjsp.com 站长QQ,点击这里给我发消息