• rownum使用说明


    参考:http://www.blogjava.net/conans/articles/219693.html

    参考:http://www.blogjava.net/freeman1984/archive/2011/01/20/343253.html

    rowid 和 rownu : http://www.2cto.com/database/201308/234809.html

      对于 Oracle 的 rownum 问题,原始SQL不支持>,>=,=(除=1外),between...and,只能用以上符号(<、<=),!=的话也会有些问题,经常是查不出一条记录来,还会出现似乎是莫名其妙的结果来,其实您只要理解好了这个 rownum 伪列的意义就不应该感到惊奇。

      ROWNUM是一种伪列,它会根据返回记录生成一个序列化的数字。利用ROWNUM,我们可以生产一些原先难以实现的结果输出,但因为它是伪列的这个特殊性,我们在使用时也需要注意一些事项,不要掉入“陷阱”。下面就介绍一下它的使用技巧及注意事项。

    1、常用方式总结

      1.1 TOP N 结果

       这个比较简单,但如果你希望对一个排序结果取Top N数据的话,使用ROWNUM存在一些“陷阱”,我们后面部分会介绍这些“陷阱”并且说明如何避免。

     1 sql> select * from t_test4
     2 
     3   2  where rownum <= 5;
     4 
     5  
     6 
     7 USERNAME                          USER_ID CREATED
     8 
     9 ------------------------------ ---------- ---------
    10 
    11 WOW                                    71 26-APR-07
    12 
    13 CS2                                    70 15-JAN-07
    14 
    15 3                                      69 01-NOV-06
    16 
    17 DMP                                    68 12-OCT-06
    18 
    19 PROFILER                               67 05-SEP-06

      1.2 分页查询,下面返回结果中的第10到第15条记录:

    1 select * from ( 
    2 selelct s.*,rownum rn from t_student s 
    3 where rownum <= 15 order by s.create_time,s.id
    4 ) a 
    5 where a.rn >10 
    1 select * from (
    2 select s.*,rownum from t_student s
    3 order by s.create_time,s.id
    4 ) a
    5 where a.rownum bettween 10 and 15;

     1.3

     --select a.class_date,rownum,a.start_time,b.class_date,b.minson
    select decode(rownum-b.minson,0,a.class_date,null),decode(rownum-b.minson,0,1,rownum+1-b.minson) sno,a.start_time
    from
    ( select class_date,start_time from t_class order by class_date,start_time ) a,
    ( select class_date,min(rownum) as minson from (select * from t_class order by class_date,start_time) group by class_date ) b
    where a.class_date=b.class_date
    order by a.class_date;

    select decode(rownum-b.minson,0,a.class_date,null),decode(rownum-b.minson,0,1,rownum+1-b.minson) sno,a.start_time
    from
    ( select class_date,min(rownum) as minson from (select * from t_class order by class_date,start_time) group by class_date ) b
    left join
    ( select class_date,start_time from t_class order by class_date,start_time ) a
    on a.class_date=b.class_date;

    3  ROWNUM的使用“陷阱”

    由于ROWNUM是一个伪列,只有有结果记录时,ROWNUM才有相应数据,因此对它的使用不能向普通列那样使用,否则就会陷入一些“陷阱”当中。

      3.1     对ROWNUM进行>、>=、=操作

      不能对ROWNUM使用>(大于1的数值)、>=(大于或等于1的数值)、=(大于或等于1的数值),否则无结果

    这是因为:

    1、ROWNUM是伪列,有了 满足查询条件后的返回结果 之后,每条返回记录就会对应产生一个ROWNUM数值;

    2、返回结果记录的ROWNUM是从1开始排序的,因此第一条始终是第一条;

     sql> select BL_REF_CDE, rownum rn from css_bl_view where rn > 1;    -无结果记录
  • 相关阅读:
    编译安装libusb操作流水账
    SM总线控制器没有驱动 关机后又自动重启
    mtd-utils编译安装过程
    STM32开发/烧录/调试环境搭建 基于:Win10+STM32Cube+openocd+cmsis-dap(dap-link)
    EchoServer和EchoClient模型的改进1之多线程
    CountDownLatch分析
    linux-java环境安装以及ssh
    ServerSocket01
    使用SecureCRT工具部署项目
    javaScript笔记01
  • 原文地址:https://www.cnblogs.com/yingsong/p/5179894.html
Copyright © 2020-2023  润新知