Oracle实现top N的实际操作步骤描述

以下的文章主要是介绍Oracle实现top N的实际操作步骤,我们都知道由于SELECT TOP语句Oracle是不支持的,所以我们在Oracle中经常使用的是ORDER BY跟ROWNUM的组合来top N实现SELECT TOP N的查询。

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

 

  1. SELECT 列名1...列名n FROM   
  2. (SELECT 列名1...列名n FROM 表名 ORDER BY 列名1...列名n)   
  3. WHERE ROWNUM <= N(抽出记录数)   
  4. ORDER BY ROWNUM ASC   

 

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

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

 

  1. ID NAME   
  2. first  
  3. Second  
  4. third  
  5. forth  
  6. fifth  
  7. sixth  
  8. seventh  
  9. eighth  
  10. ninth  
  11. tenth  
  12. last   

 

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

 

  1. SELECT * FROM   
  2. (SELECT * FROM CUSTOMER ORDER BY NAME)   
  3. WHERE ROWNUM <= 3   
  4. ORDER BY ROWNUM ASC   
  5.  

 

输出结果为:

 

  1. ID NAME  
  2. eighth  
  3. fifth  
  4. first   

 

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

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

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

 

  1. SELECT 列名1...列名n FROM   
  2. (   
  3. SELECT ROWNUM RECNO, 列名1...列名nFROM   
  4. (SELECT 列名1...列名n FROM 表名 ORDER BY 列名1...列名n)   
  5. WHERE ROWNUM <= N(抽出记录数)   
  6. ORDER BY ROWNUM ASC   
  7. )   
  8. WHERE RECNO = M(M <= N)   

 

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

 

  1. SELECT ID, NAME FROM   
  2. (   
  3. SELECT ROWNUM RECNO, ID, NAME FROM   
  4. (SELECT * FROM CUSTOMER ORDER BY NAME)   
  5. WHERE ROWNUM <= 3   
  6. ORDER BY ROWNUM ASC )   
  7. WHERE RECNO = 2   

 

结果则为:

 

  1. ID NAME  
  2. 05 fifth   

 

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

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

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

 

  1. SELECT 列名1...列名n FROM   
  2. (   
  3. SELECT ROWNUM RECNO, 列名1...列名nFROM   
  4. (SELECT 列名1...列名n FROM 表名 ORDER BY 列名1...列名n)   
  5. WHERE ROWNUM <= N(抽出记录数)   
  6. ORDER BY ROWNUM ASC   
  7. )   
  8. WHERE RECNO = N   

 

那么,2中的例子的SQL语句则为:

 

  1. SELECT ID, NAME FROM   
  2. (   
  3. SELECT ROWNUM RECNO, ID, NAME FROM   
  4. (SELECT * FROM CUSTOMER ORDER BY NAME)   
  5. WHERE ROWNUM <= 2   
  6. ORDER BY ROWNUM ASC   
  7. )   
  8. WHERE RECNO = 2   

 

结果为:

 

  1. ID NAME  
  2. 05 fifth   

 

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

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

 

  1. SELECT 列名1...列名n FROM   
  2. (   
  3. SELECT ROWNUM RECNO, 列名1...列名nFROM   
  4. (  
  5. SELECT 列名1...列名n FROM 表名 ORDER BY 列名1...列名n)   
  6. WHERE ROWNUM <= N (N >= (M + X - 1))   
  7. ORDER BY ROWNUM ASC   
  8. )   
  9. WHERE RECNO BETWEEN M AND (M + X - 1)   

 

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

 

  1. SELECT ID, NAME FROM   
  2. (   
  3. SELECT ROWNUM RECNO, ID, NAME FROM   
  4. (SELECT * FROM CUSTOMER ORDER BY NAME)   
  5. WHERE ROWNUM <= (2 + 3 - 1)   
  6. ORDER BY ROWNUM ASC   
  7. )   
  8. WHERE RECNO BETWEEN 2 AND (2 + 3 - 1)   

 

结果如下:

 

  1. ID NAME  
  2. 05 fifth  
  3. 01 first  
  4. 04 forth   

 

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

文章出自:http://www.programbbs.com/doc/class10-2.htm
 

【编辑推荐】

  1. Oracle sql 性能如何进行调整
  2. Oracle sql 性能的优化调整的2大步骤
  3. 对Oracle SQL相同语句的解析
  4. 何谓Oracle标准化?
  5. Oracle数据库与DM的强制访问的不同之处

文章来源网络,作者:管理,如若转载,请注明出处:https://shuyeidc.com/wp/242774.html<

(0)
管理的头像管理
上一篇2025-04-24 23:15
下一篇 2025-04-24 23:16

相关推荐

  • 高防服务器的防御原理是什么,如何选择高防服务器?

    高防服务器的防御原理,简单说就是通过流量清洗、防火墙规则和黑洞路由等机制,在攻击流量到达业务服务器之前将其过滤或阻断,从而保障正常访问,流量清洗机制是核心防线高防服务器对抗DDoS攻击,靠的不是单一技术,而是一套组合动作,最常见的攻击类型是流量型攻击,比如UDP洪水、SYN洪水、ICMP放大等,核心思路是耗尽带……

    2026-07-26
    0
  • BGP线路到底是什么意思呢,有什么优势?

    BGP线路是一种通过边界网关协议实现多运营商网络互联的接入方式,能自动选择最优路径,极大提升跨网访问速度和稳定性,是解决国内南北网络瓶颈的核心方案,什么是BGP线路BGP,全称Border Gateway Protocol,边界网关协议,是互联网核心路由协议之一,它负责在自治系统之间交换网络可达性信息,BGP线……

    2026-07-26
    0
  • 增值电信业务经营许可证对IDC有多重要,如何办理?

    增值电信业务经营许可证是IDC服务商合法运营的核心凭证,它直接决定了机房能否接入骨干网、客户能否放心托管业务,以及服务商自身能否长期稳定发展,许可证是IDC进入市场的硬门槛互联网数据中心业务属于增值电信业务中的B1类,依据工信部《电信业务经营许可管理办法》,任何从事服务器托管、虚拟主机、云服务等业务的企业,必须……

    2026-07-26
    0
  • 站群服务器一个IP放几个网站合适?,怎么选

    站群服务器一个IP放3-5个网站是大多数情况下的最佳平衡点,但具体数量需根据网站权重、内容质量及IP资源成本灵活调整,这个结论基于搜索引擎对同IP站点的关联判定逻辑,以及站群运营的长期实践,如果你刚接触站群,可能会纠结于IP分配,但核心原则是:不要让搜索引擎轻易识别出这些网站属于同一实体,站群IP分配的底层逻辑……

    2026-07-26
    0
  • DDoS攻击和CC攻击有什么区别,怎么防御?

    DDoS攻击和CC攻击最核心的区别在于攻击目标不同:DDoS攻击主要消耗网络带宽和基础设施资源,而CC攻击专门针对应用层逻辑,耗尽服务器CPU和数据库连接数,两者从原理到防御手段完全不同,攻防视角下的本质差异攻击目标:一个砸门,一个撬锁DDoS攻击(分布式拒绝服务)瞄准的是网络层和传输层,通过大量伪造数据包或畸……

    2026-07-26
    0

发表回复

您的邮箱地址不会被公开。必填项已用 * 标注