zoukankan      html  css  js  c++  java
  • Oracle数据库实现获取前几条数据的方法

    如何在Oracle数据库中实现获取前几条数据的方法呢?就是类似SQL语句中的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 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...列名nFROM
     (
     SELECT ROWNUM RECNO, 列名1...列名nFROM
    (SELECT 列名1...列名nFROM 表名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的时候,即为我们的标题第三点所讲的结果。实际上,第二点的做法在里面N>M的部分的数据是基本上不会用到的,我们仅仅是为了说明方便而采用。
    如上所述,则SQL语句应为:


    SELECT 列名1...列名nFROM
     (
    SELECT ROWNUM RECNO, 列名1...列名nFROM
    (SELECT 列名1...列名nFROM 表名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条记录:
    上一点所讲的仅仅是抽取一条记录的情况,当我们需要抽取多条记录的时候,此时在第二点中的N的取值应该是在N >= (M + X - 1)这个范围内,当然最经济的取值就是取等号的时候了。当然最后的抽取条件也不是RECNO = N了,应该是RECNO BETWEEN M AND (M + X - 1)了,所以随之而来的SQL语句则为:
     
    SELECT 列名1...列名nFROM
    (
     SELECT ROWNUM RECNO, 列名1...列名nFROM
    (
    SELECT 列名1...列名nFROM 表名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 NAME
    05 fifth
    01 first
    04 forth
     
    以此为基础,再扩展的话,做成存储过程,将开始记录数以及抽取记录数为参数,就可以轻松实现分页抽取数据。

  • 相关阅读:
    1063. Set Similarity
    A1047. Student List for Course
    A1039. Course List for Student
    最大公约数、素数、分数运算、超长整数计算总结
    A1024. Palindromic Number
    A1023. Have Fun with Numbers
    A1059. Prime Factors
    A1096. Consecutive Factors
    A1078. Hashing
    A1015. Reversible Primes
  • 原文地址:https://www.cnblogs.com/mazhenyu/p/5799045.html
Copyright © 2011-2022 走看看