网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 网络编程 > 数据库 > Oracle教程
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程,分词,IIS,Apache,Tomcat,phpmyadmin,Gzip,触发器,socket
数据库:数据库教程,数据库技巧,Oracle教程,MySQL教程,Sybase教程,Access教程,DB2教程,数据库安全,数据库文摘
本月文章推荐
.Oracle 9i新特性研究五(监视未使.
.Oracle9i 性能调整与优化(2).
.exp/imp导出导入工具的使用.
.如何列出一个目录占用的空间.
.Developer/2000 R2.1 中文版 在 .
.Oracle数据库技术(28).
.Oracle数据库用VPD来确保信息的隐.
.linux下如何用exp导出oracle10g的.
.oracle 使用杂记2.
.ORACLE数据库备份方法.
.Oracle Database 10 g : 为 DBA .
.Oracle10g回溯版本查询追踪行变化.
.关于dblink举例.
.Oracle 10G Beta版本Bug及其解决.
.Fravo Oracle 1Z0-147 v1.0.
.如何移动Oracle数据库的表空间.
.在Oracle8i的SQL*Plus中如何利用.
.多个数据库时 如何设置默认数据库.
.Ruby on Rails之Oracle应用(1).
.SQL Server与Oracle并行访问本质.

在ORACLE中实现SELECT TOP N的方法

发表日期:2008-2-9


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     以此为基础,再扩展的话,做成存储过程,将开始记录数以及抽取记录数为参数,就可以轻松实现分页抽取数据。      当然了,上面所讲的都是一些最基本的,实际应用中往往都没有这么简单,但是不管怎么说,不管复杂的应用总是由这些简单的元素构成,把握一些最基本的方法始终是重要的。    实际上网上这样的文章比较多,我也只是稍微梳理了一下条理而写的这篇文章。希望能给初学者一些帮助。
上一篇:Oracle中通过触发器来追踪用户的活动 人气:839
下一篇:Oracle中实现大量数据快速转移数据 人气:535
浏览全部Oracle教程的内容 Dreamweaver插件下载 网页广告代码 祝你圣诞节快乐 2009年新年快乐