首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > 其他数据库 >

Oracle数据库分页(3)

2012-07-16 
Oracle数据库分页(三)1.在ORACLE中实现SELECT TOP N由于ORACLE不支持SELECT TOP语句,所以在ORACLE中经常是

Oracle数据库分页(三)
        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 

SQL> select rownum, hs_login from           (              select hs_login from t_users order by hs_login           )            where rownum < 5 order by rownum desc;    ROWNUM HS_LOGIN---------- --------------------------------------------------         4 admin101         3 admin100         2 admin10         1 admin1Elapsed: 00:00:00.03

        2.在TOP N纪录中抽出第M(M <= N)条记录
        ROWNUM是记录表中数据编号的一个隐藏子段,所以可以在得到TOP N条记录的时候同时抽出记录的ROWNUM,然后再从这N条记录中抽取记录编号为M的记录,即使我们希望得到的结果。
SELECT 列名1...列名n FROM     (         SELECT ROWNUM RN, 列名1...列名n FROM         (            SELECT 列名1...列名n FROM 表名 ORDER BY 列名1...列名n         )         WHERE ROWNUM <= N(抽出记录数)         ORDER BY ROWNUM ASC     )     WHERE RN = M(M <= N)

SQL> select rownum, hs_login, hs_nick_name from      (         select rownum rn, hs_login, hs_nick_name from            (                select hs_login, hs_nick_name from t_users order by hs_login            )            where rownum < 5            order by rownum desc       )      where rn = 3;    ROWNUM HS_LOGIN      HS_NICK_NAME---------- ------------- --------------         1 admin100      Lcr AdminElapsed: 00:00:00.08

        3.抽出从第M条记录开始的X条记录
SELECT 列名1...列名n FROM     (        SELECT ROWNUM RN, 列名1...列名nFROM        (           SELECT 列名1...列名n FROM 表名 ORDER BY 列名1...列名n)        )        WHERE ROWNUM <= N (N = (M + X - 1))        ORDER BY ROWNUM ASC     )     WHERE RN >= M

SQL> select rownum, hs_uuid, hs_login from       (           select rownum rn, hs_uuid, hs_login from              (                  select hs_login, hs_uuid from t_users order by hs_uuid               )               where rownum < 800               order by rownum desc       )       where rn > 790;    ROWNUM    HS_UUID HS_LOGIN---------- ---------- --------------------------------------------------         1        799 admin799         2        798 admin798         3        797 admin797         4        796 admin796         5        795 admin795         6        794 admin794         7        793 admin793         8        792 admin792         9        791 admin7919 rows selected.Elapsed: 00:00:00.12

         注意:
         当我们order by时的字段为hs_login的话并没有达到我们希望的效果,即便是我给字段hs_login添加了索引。但是,当我使用主键hs_uuid时,可以取到我们希望的数据。这里需要进一步的学习来得出结论,暂时不知其原因。
<<OVER>>

热点排行