AD
AD

oracle中实现top N

时间:2007-12-29 10:22:21  来源:  作者:
AD

1.在ORACLE中实现SELECT TOP N

   由于ORACLE不支持SELECT TOP语句,所以在ORACLE中经常是用ORDER BY跟ROWNUM的组合来实现SELECT TOP N的查询。 字串7

  简单地说,实现方法如下所示: 字串4

      SELECT 列名1...列名n FROM

字串2

        (SELECT 列名1...列名n FROM 表名 ORDER BY 列名1...列名n) 字串5

       WHERE ROWNUM <= N(抽出记录数)

字串5

      ORDER BY ROWNUM ASC 字串3

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

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

      ID NAME 字串6

       01 first 字串4

       02 Second 字串5

       03 third

字串1

       04 forth

字串5

       05 fifth

字串4

       06 sixth

字串7

       07 seventh

字串4

       08 eighth 字串7

       09 ninth

字串7

       10 tenth 字串4

       11 last

字串6

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

字串4

      SELECT * FROM

字串9

        (SELECT * FROM CUSTOMER ORDER BY NAME)

字串7

       WHERE ROWNUM <= 3

字串8

       ORDER BY ROWNUM ASC 字串6

   输出结果为: 字串3

      ID NAME

字串3

       08 eighth

字串9

       05 fifth

字串1

       01 first

字串2

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

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

字串9

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

字串3

      SELECT 列名1...列名n FROM 字串7

         (

字串8

         SELECT ROWNUM RECNO, 列名1...列名nFROM 字串9

           (SELECT 列名1...列名n FROM 表名 ORDER BY 列名1...列名n) 字串6

         WHERE ROWNUM <= N(抽出记录数) 字串3

       ORDER BY ROWNUM ASC 字串6

         ) 字串5

       WHERE RECNO = M(M <= N)

字串4

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

字串6

       SELECT ID, NAME FROM 字串6

         ( 字串5

          SELECT ROWNUM RECNO, ID, NAME FROM 字串2

            (SELECT * FROM CUSTOMER ORDER BY NAME)

字串7

             WHERE ROWNUM <= 3

字串9

             ORDER BY ROWNUM ASC ) 字串8

           WHERE RECNO = 2 字串6

     结果则为:

字串2

       ID NAME

字串6

        05 fifth

字串6

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

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

字串6

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

字串6

       SELECT 列名1...列名n FROM 字串3

         ( 字串9

          SELECT ROWNUM RECNO, 列名1...列名nFROM

字串7

            (SELECT 列名1...列名n FROM 表名 ORDER BY 列名1...列名n)

字串8

             WHERE ROWNUM <= N(抽出记录数) 字串4

          ORDER BY ROWNUM ASC 字串2

         )

字串8

         WHERE RECNO = N

字串5

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

        SELECT ID, NAME FROM

字串3

          ( 字串4

           SELECT ROWNUM RECNO, ID, NAME FROM 字串7

             (SELECT * FROM CUSTOMER ORDER BY NAME) 字串2

           WHERE ROWNUM <= 2 字串2

           ORDER BY ROWNUM ASC

字串2

          ) 字串2

          WHERE RECNO = 2

字串6

     结果为: 字串2

       ID NAME 字串7

        05 fifth

字串3

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

字串1

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

       SELECT 列名1...列名n FROM

字串6

        ( 字串2

         SELECT ROWNUM RECNO, 列名1...列名nFROM 字串5

          ( 字串6

          SELECT 列名1...列名n FROM 表名 ORDER BY 列名1...列名n)

字串3

          WHERE ROWNUM <= N (N >= (M + X - 1))

字串1

        ORDER BY ROWNUM ASC 字串8

          ) 字串8

         WHERE RECNO BETWEEN M AND (M + X - 1) 字串1

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

字串7

       SELECT ID, NAME FROM 字串2

         ( 字串6

          SELECT ROWNUM RECNO, ID, NAME FROM

字串1

            (SELECT * FROM CUSTOMER ORDER BY NAME) 字串7

          WHERE ROWNUM <= (2 + 3 - 1)

字串2

          ORDER BY ROWNUM ASC 字串2

         ) 字串3

         WHERE RECNO BETWEEN 2 AND (2 + 3 - 1)

字串9

     结果如下:

字串5

       ID NAME 字串9

        05 fifth

字串9

        01 first

字串9

        04 forth 字串7

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

字串2


文章评论

共有 0位编程爱好者发表了评论 查看完整内容

    评论加载中…
忒好程序员:www.teihao.com

推荐信息

     
忒好程序员
AD