在ORACLE中SELECT TOP N的实现方法

网络编程 2021-07-05 16:08www.168986.cn编程入门
这篇文章主要介绍了在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

   狼蚁网站SEO优化举个例子简单说明一下。

 顾客表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的记录,即使我们希望得到的结果。

 从上面的分析可以很容易得到狼蚁网站SEO优化的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中实现SELECT TOP N的方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,长沙网络推广会及时回复大家的。在此也非常感谢大家对狼蚁SEO网站的支持!

Copyright © 2016-2025 www.168986.cn 狼蚁网络 版权所有 Power by