您当前的位置: 首页 > 数据库教程 > Oracle教程 > 教你在Oracle中实现SELECT TOP N的方法

教你在Oracle中实现SELECT TOP N的方法

作者:guanchaofeng 来源:不详 发布时间: 2009-09-30 08:38 点击:
本文通过举例的方式来教你如何在Oracle中实现SELECT TOP N的方法。 1.在Oracle中实现SELECT TOP N : 由于ORACLE不支持SELECT TOP语句,所以在ORACLE中经常是用ORDER BY跟ROWNUM的组合来实现SELECT TOP N的查询。 简单地说,实现方法如下所示: SELECT 列名

教你在Oracle中实现SELECT TOP N的方法

本文通过举例的方式来教你如何在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 first02 Second03 third04 forth05 fifth06 sixth07 seventh08 eighth09 ninth10 tenth11 last

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

SELECT * FROM (SELECT * FROM CUSTOMER ORDER BY NAME) WHERE ROWNUM <= 3 ORDER BY ROWNUM ASC

输出结果为:

ID NAME08 eighth05 fifth01 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 NAME05 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 NAME05 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 NAME05 fifth01 first04 forth

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

分享到:
本文"教你在Oracle中实现SELECT TOP N的方法"由远航站长收集整理而来,仅供大家学习与参考使用。更多网站制作教程尽在远航站长站。
顶一下
(0)
0%
踩一下
(0)
0%
[点击 次] [返回上一页] [打印]
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 密码: 验证码:
关于本站 - 联系我们 - 网站声明 - 友情连接- 网站地图 - 站点地图 - 返回顶部
Copyright © 2007-2013 www.yhzhan.com(远航站长). All Rights Reserved .
远航站长:为中小站长提供最佳的学习与交流平台,提供网页制作与网站编程等各类网站制作教程.
官方QQ:445490277 网站群:26680406 网站备案号:豫ICP备07500620号-4