Oracle 10g 前n条查询记录的取得方法

取某个查询结果的前几条记录,在SqlServer中是很简单的,直接使用TOP关键字就可以,这里就不多说了。

SqlServer 2005中取前5条记录:

1 SELECT TOP 5 T.MEMBER_ID,T.MEMBER_NAME
2 FROM MEMBER T
3 ORDER BY MEMBER_ID;

本篇主要介绍在Oracle中是如何取得某个查询结果的前几条记录的方法。

与SqlServer类似,Oracle也提供了提取前几条查询记录的关键字ROWNUM,但是有不少人在实际使用时,

总是把ROWNUM用错,下举例为证:

SELECT EMPNO,ENAME,HIREDATE
FROM SCOTT.EMP
ORDER BY HIREDATE ASC;

执行结果:

    EMPNO ENAME      HIREDATE
---------- ---------- -------- 

                                                  前5条

      7369 SMITH      80-12-17
      7499 ALLEN      81-02-20
      7521 WARD       81-02-22
      7566 JONES      81-04-02
      7698 BLAKE      81-05-01     

     7782 CLARK      81-06-09
      7844 TURNER     81-09-08
      7654 MARTIN     81-09-28
      7839 KING       81-11-17
      7900 JAMES      81-12-03
      7902 FORD       81-12-03
      7934 MILLER     82-01-23
      7788 SCOTT      87-04-19
      7876 ADAMS      87-05-23

14行が選択されました。

取前五条记录的SQL:

SELECT EMPNO,ENAME,HIREDATE
FROM SCOTT.EMP
WHERE ROWNUM < 6
ORDER BY HIREDATE;

执行结果:

     EMPNO ENAME      HIREDATE
---------- ---------- --------

      7369 SMITH      80-12-17
      7499 ALLEN      81-02-20
      7521 WARD       81-02-22
      7566 JONES      81-04-02
      7654 MARTIN     81-09-28

 

 

 

 

 

从上面的执行结果看,第五条数据和我们预想的不一样,这说明Oracle在Order by之前已经先解析了ROWNUM

(有兴趣的朋友可以自己调试一下),下面我给出正确的取前5条记录的方法:

取前五条记录的SQL:

SELECT * 
FROM ( SELECT EMPNO,ENAME,HIREDATE
FROM SCOTT.EMP
ORDER BY HIREDATE ) 
WHERE ROWNUM < 6;

执行结果:

     EMPNO ENAME      HIREDATE
---------- ---------- --------
      7369 SMITH      80-12-17
      7499 ALLEN      81-02-20
      7521 WARD       81-02-22
      7566 JONES      81-04-02
      7698 BLAKE      81-05-01

 

 

 

 

 

 

 

完全正确。

思考:

取前N条记录的方法我们是找到了,那取第N条呢?应该也没什么难的,但是效率会如何呢?

要知道SQL执行时最怕的就是Order by语句的执行,这个问题留给有兴趣的朋友,

下次再告诉大家。

posted on 2010-06-02 11:15  flycatorg  阅读(1939)  评论(0编辑  收藏  举报

导航