精华内容
下载资源
问答
  • oracle rownum

    2015-01-09 17:44:28
    选择出来的,它不是表本身的属性,它是个伪列,当有一条记录被查询出来时,它的rownum就是1,有记录出来时,rownum就为2。 也就是说它是当结果集被返回时才赋予的,  比如 select rownum,pesn_id from ...

           oracle的rownum是可以通过select rownum ... from ... 选择出来的,它不是表本身的属性,它是一个伪列,当有一条记录被查询出来时,它的rownum就是1,有第二条记录出来时,rownum就为2。 也就是说它是当结果集被返回时才赋予的,

          比如 select rownum,pesn_id from person where sex='woman'

           与 select rownum,pesn_id from person where sex='man'  这两条sql语句返回的值完全不一样,但是rownum始终是从1开始递增的。

     

           我们去sql语句的第一条记录时会用到where rownum=1 ,但是rownum>5不会出现任何数据,这不是语句出错,而是查不到结果。如上,只有当第一条记录返回时rownum才会加1,但rownum=1的这条结果是不满足rownum>5这个条件的,所以不会查询出来。而第二条记录返回时,由于rownum=1的记录没有所以这条记录的rownum依旧为1,同样的其他记录也不会选出来。

           这就是为什么rownum 的大于条件不会出数据,而小于会出数据,包括=,!=,>=,<=等;


           因为rownum 的特性,它是不能用来直接排序的

                select rownum as num,cot_gw_cont,gwcon_key,create_date from    cot_gw_main   order by gwcon_key


         必须使用子查询

                 select rownum,cot_gw_cont,gwcon_key,create_date from  ( select * from    cot_gw_main   order by gwcon_key) 

             

          如果要取返回数据的第m(M>1)行到第n行,oracle没有mysql的limit,通常的方法就是利用上面讲的子查询,先选出rownum<n的数据,然后再已有数据的基础上选出rownum>m的数据(这是rownum已经存在,就会有记录)

              select num,cot_gw_cont,gwcon_key,create_date from
                   ( select rownum as num,cot_gw_cont,gwcon_key,create_date from    cot_gw_main where rownum<10  order by gwcon_key )   
                  where  num>5

          注意:子查询的rownum必须换名,不然父查询依然没有数据



    展开全文
  • rownumoracle才有的写法,rownumoracle中可以用于取第一条数据,或者批量写数据时限定批量写的数量等mysql取第一条数据写法SELECT * FROM t order by id LIMIT 1;oracle取第一条数据写法SELECT * FROM t where ...

    rownum是oracle才有的写法,rownum在oracle中可以用于取第一条数据,或者批量写数据时限定批量写的数量等

    mysql取第一条数据写法

    SELECT * FROM t order by id LIMIT 1;

    oracle取第一条数据写法

    SELECT * FROM t where rownum =1 order by id;

    ok,上面是mysql和oracle取第一条数据的写法对比,不过这只是rownum的一种用法,rownum还可以用于批量写数据

    往t表批量写一万条数据:

    insert into t(id,date) select sys_guid(),sysdate from dual connect by rownum<=10000;

    oracle原版写法:

    select * from (select id,name from t) where rownum to_number(num);

    mysql改写后的SQL:

    SELECT

    *

    FROM

    (SELECT

    tb.*,

    @rownum := @rownum + 1 AS rownum

    FROM

    (SELECT

    id,

    NAME

    FROM

    t) tb,

    (SELECT

    @rownum := 0) r) AS t

    WHERE rownum <= CAST(num AS SIGNED INTEGER) ;

    以上就是本次介绍的全部知识点内容,感谢大家对龙方网络的支持。

    展开全文
  • OracleRownum

    2020-06-16 08:33:37
    ROWNUMoracle从8开始提供的个伪列,是把SQL出来的结果进行编号,始终从1开始,常见的用途就是用来分页输出. 比如 SELECT * FROM torderdetail a WHERE ROWNUM <= 10 这语句就是输出前10纪录,在这里用途...

    下面是关于rownum的介绍

    三、 Rownum和row_number() over()的使用
    ROWNUM是oracle从8开始提供的一个伪列,是把SQL出来的结果进行编号,始终从1开始,常见的用途就是用来分页输出.
    比如

    SELECT * 
      FROM torderdetail a 
    WHERE ROWNUM <= 10 
    这条语句就是输出前10条纪录,在这里用途上类似于sql sever的top,不过rownum对于指定编号区间的输出应该说更强大 
    SELECT * 
      FROM (SELECT a.*, ROWNUM rn 
              FROM torderdetail a) 
    WHERE rn >= 10 AND rn <= 20 
    

    这条语句即是输出第10到第20条纪录,这里之所以用rownum rn,是把rownum转成实例,因为rownum本身只能用 <=的比较方式,只有转成实列,这样就可做 >=的比较了。
    在实际用途中,常常会要求取最近的几条纪录,这就需要先对纪录进行排序后再取rownum <=
    一般常见的

    SELECT * 
    FROM (SELECT  a.* 
                FROM torderdetail a 
            ORDER BY order_date DESC) 
    WHERE ROWNUM <= 10 
    

    而在CSDN曾经发生过讨论,关于取近的10条纪录,有人给出这样的语句

    SELECT  a.* 
        FROM torderdetail a 
      WHERE ROWNUM <= 10 
    ORDER BY order_date DESC 
    

    之所以会出现这样的语句,主要是从效率上的考虑,前面条语句,是要进行全表扫描后再排序,然后再取10条纪录,后一条语句则不会全表扫描,只会取出10条纪录,很明显后条语句的效率会高许多。
    那为什么会有争议呢,那就在于在执行顺序上争议,是先执行排序取10条纪录,还是取10条纪录,再排序呢?两种顺序取出来的结果是截然相反的,先排序再取10条,就是取最近的10条,而先取10条,再排序,则取出的最早的10条纪录。对于此语句,普遍的认为执行顺序是先取10条纪录再排序的。所以此语句应该是错误。但实际上并非如此,此语句的执行顺序和order by的字段有关系,如果你order by 的字段是pk,则是先排序,再取10条(速度比第一种语句快),而排序字段不是PK 时,是先取10条再排序,此时结果就与要求不一样了,所以第二种写法一定要在排序字段是主键的情况下才能保证结果正确。
    Row_number() over()这个分析函数是从9I开始提供的,一般的用途和rownum差不多。
    一般写法row_number() over( order by order_date desc) 生成的顺序和rownum的语句一样,效率也一样(对于同样有order by 的rownum语句来说),所以在这种情况下两种用法是一样的。
    而对于分组后取最近的10条纪录,则是rownum无法实现的,这时只有row_number可以实现,row_number() over(partition by 分组字段 order by 排序字段)就能实现分组后编号,比如说要取近一个月的每天最后10个订单纪录

    SELECT * 
      FROM (SELECT a.*, 
    ROW_NUMBER () OVER (PARTITION BY TRUNC (order_date) ORDER BY order_date DESC) 
                                                                              rn 
              FROM torderdetail a) 
    WHERE rn <= 10 
    

    Rownum的另类用法,有时候我们会遇到这种需求,要求输出当月的所有天数,许多人会烦恼,数据库里又没有这样的表,怎么输出一个月的所有天数呢?用rownum就能解决:

    SELECT    TRUNC (SYSDATE, 'MM') + ROWNUM - 1 
          FROM DUAL 
    CONNECT BY ROWNUM <= TO_NUMBER (TO_CHAR (LAST_DAY (SYSDATE), 'dd'))
    

    rownum,rowid都叫伪列。 但是,rownum是逻辑上的编号,且其值总是从1开始,每行的rounum不是固定的。而rowid是“物理”编号。若数据库文件没有移动,则每行的 rowid一般是固定不变的。

    对于 Oracle的 rownum 问题,很多资料都说不支持>,>=,=,between…and,只能用以上符号(<、<=、!=),并非说用>,>=,=,between…and时会提示SQL语法错误,而是经常是查不出一条记录来。

    假设某个表 t1(c1)有 20 条记录

    如果用 select rownum,c1 from t1 where rownum < 10,只要是用小于号,查出来的结果很容易地与一般理解在概念上能达成一致,应该不会有任何疑问的。

    可如果用 select rownum,c1 from t1 where rownum > 10 (如果写下这样的查询语句,这时候在您的头脑中应该是想得到表中后面10条记录),你就会发现,显示出来的结果要让您失望了,也许您还会怀疑是不谁删了一些记录,然后查看记录数,仍然是 20 条啊?那问题是出在哪呢?

    先好好理解 rownum的意义吧。因为ROWNUM是对结果集加的一个伪列,即先查到结果集之后再加上去的一个列 (强调:先要有结果集)。简单的说 rownum是对符合条件结果的序列号。它总是从1开始排起的。所以你选出的结果不可能没有1,而有其他大于1的值。

    rownum >10没有记录,因为第一条不满足去掉的话,第二条的ROWNUM又成了1,所以永远没有满足条件的记录。或者可以这样理解:

    ROWNUM是一个序列,是oracle数据库从数据文件或缓冲区中读取数据的顺序。它取得第一条记录则rownum值为1,第二条为2,依次类推。如果你用>,>=,=,between…and这些条件,因为从缓冲区或数据文件中得到的第一条记录的rownum为1,则被删除,接着取下条,可是它的rownum还是1,又被删除,依次类推,便没有了数据。

    oracle rownum分页出现重复数据

    通常一般的分页语句如下:

    select *
    from (
    select row_.*, rownum rownum_
    from ( select p.id from table1 p
    order by p.DATA_UPDATE_TIME desc )
    row_ where rownum <=) b
    where b.rownum_ >

    当红字部分的 DATA_UPDATE_TIME 不能唯一确定记录的顺序就会出现这个问题,比如有重复的DATA_UPDATE_TIME 。

    只要将语句写成:

    select * from (   
    select row_.*, rownum rownum_   
    from (  
    select p.id from table1 p   
    order by p.DATA_UPDATE_TIME desc   
    ) row_   )   
    where rownum_ > ? and rownum_ <= ?
    

    将结果集全部查出来后再分组就ok.

    另一种改法:

    select *
    from (
    select row_.*, rownum rownum_
    from ( select p.id from table1 p
    order by p.DATA_UPDATE_TIME desc,p.id desc )
    row_ where rownum <=) b
    where b.rownum_ >

    再加一个不重复的列也就行了

    展开全文
  • oracle和sql server取第一条记录的区别以及rownum详解

    首先给大家分享一个巨牛巨牛的人工智能教程,是我无意中发现的。教程不仅零基础,通俗易懂,而且非常风趣幽默,还时不时有内涵段子,像看小说一样,哈哈~我正在学习中,觉得太牛了,所以分享给大家!点这里可以跳转到教程

                   


    我们知道学生可能有重名的情况,那么当重名的时候假设只需要取得重名结果集中的第一条记录。

     

    sql server:
    select top(1) num,Name from M_Student where name = 'xy'

     

    Oracle:
    select num,Name from M_Student where name = 'xy' and rownum <= 1


    对于rownum在oracle的使用的时候,有几点需要注意:

     

    (1) rownum 对于等于某值的查询条件

    如果希望找到学生表中第一条学生的信息,可以使用rownum=1作为条件。但是想找到学生表中第二条学生的信息,使用rownum=2结果查不到数据。因为rownum都是从1开始,但是1以上的自然数在rownum做等于判断是时认为都是false条件,所以无法查到rownum = n(n>1的自然数)。


    (2) rownum对于大于某值的查询条件

    如果想找到从第二行记录以后的记录,当使用rownum>2是查不出记录的,原因是由于rownum是一个总是从1开始的伪列,Oracle 认为rownum> n(n>1的自然数)这种条件依旧不成立,所以查不到记录。

     

    (3) rownum对于小于某值的查询条件

    rownum对于rownum<n(n>1的自然数)的条件认为是成立的,所以可以找到记录。比如 rownum < 3


    (4) rownum和排序

    Oracle中的rownum的是在取数据的时候产生的序号,所以想对指定排序的数据去指定的rowmun行数据就必须注意了。

    select rownum ,id,name from student order by name;
      
    ROWNUM    ID          NAME
    3                200003     李三
    2                200002     王二
    1                200001     张一
    4                200004     赵四

    可以看出rownum并不是按照name列来生成的序号。系统是按照记录插入时的顺序给记录排的号,rowid也是顺序分配的。必须使用子查询。

     

    select rownum ,id,name from (select * from student order by name);

    ROWNUM    ID          NAME
    3                200003     李三
    2                200002     王二
    1                200001     张一
    4                200004     赵四

    这样就成了按name排序,并且用rownum标出正确序号(由小到大)

     
    看一个例子

    把最先进入公司的5个人找出来

    方法一 SELECT * FROM emp WHERE ROWNUM <= 5 ORDER BY hiredate;

    方法二 SELECT * FROM(SELECT * FROM emp ORDER BY hiredate) WHERE ROWNUM <= 5;

     


    把最先进入公司的6-10个人找出来

    方法一
    SELECT * FROM (SELECT * FROM emp ORDER BY hiredate)
    WHERE ROWNUM <= 10  
    MINUS
    SELECT * FROM (SELECT * FROM emp ORDER BY hiredate)
    WHERE ROWNUM <= 5;

     

    方法二(分页常用)
    SELECT * FROM (SELECT e.*, ROWNUM rn FROM (SELECT * FROM emp) e WHERE ROWNUM <= 10) t WHERE t.rn >= 6; 

    SELECT * FROM (SELECT e.*, ROWNUM rn FROM (SELECT ename, sal FROM emp) e WHERE ROWNUM <= 10) WHERE rn >= 6;


    参考博客:

    http://topic.csdn.net/t/20040329/17/2900155.html
    http://apps.hi.baidu.com/share/detail/5881277

     

               

    浏览人工智能教程

    展开全文
  • Oracle ROWNUM

    2017-11-15 11:33:29
    ROWNUM和ROWID一樣也是一個偽列,按ORACLE從buffer cache或data file中的順序開始計數的。 ROWNUM=1也就是讀到的第一條,當這記錄被刪除ROWNUM將變為...
  • Oracle rownum

    2014-04-22 10:06:17
    对于rownum ,是where 条件之后进行的编号
  • 全面解析oracle rownum

    2013-12-18 13:41:01
    全面解析oracle rownum
  • rownumoracle才有的写法,rownumoracle中可以用于取第一条数据,或者批量写数据时限定批量写的数量等 mysql取第一条数据写法 SELECT * FROM t order by id LIMIT 1; oracle取第一条数据写法 SELECT * FROM t ...
  • ORACLE ROWNUM

    2013-02-26 14:12:00
    =,=,between..and 时会提示SQL语法错误,而是经常是查不出一条记录来,还会出现似乎是莫名其妙的结果来,其实您只要理解好了这个 rownum 伪列的意义就不应该感到惊奇,同样是伪列,rownum 与...
  • ORACLE ROWNUM用法

    2019-01-09 17:35:25
    ORACLEROWNUM用法总结! 对于 Oraclerownum 问题,很多...=,=,between…and 时会提示SQL语法错误,而是经常是查不出一条记录来,还会出现似乎是莫名其妙的结果来,其实您只要理解好了这个 rownum 伪列的意义就...
  • Oracle rownum 分页, 排序

    千次阅读 2014-11-11 20:34:07
    Rownumoracle生成结果集时得到的一个伪列, 按照读出行的顺序, 第一条rownum=1, 第二=2. 对于 Oraclerownum 问题,很多资料都说不支持>,>=,=,between...and,只能用以上符号(,>=,=,between..an
  • Oracle rownum介绍

    2017-08-14 19:10:00
    rownum和rowid都是伪列,但是两者的根本是不同的,rownum是根据sql查询出的结果给每行分配个逻辑编号,所以你的sql不同也就会导致最终rownum不同,但是rowid是物理结构上的,在每记录insert到数据库中时...
  • oracle rownum rowid

    2015-03-11 16:00:49
    rownum和rowid也被称为oracle的伪列,就像表中的列一样,但是实际并未存储,也不可以对该列进行更新,删除之类的操作。 rowid:数据库中的每行都有个行地址,Rowid伪列返回该行地址。可以使用Rowid值来定位表...
  • ORACLE ROWNUM ROWid

    2012-05-17 22:40:55
    对于 Oraclerownum 问题,很多资料都说不支持>,>=,=,between...and,只能用以上符号(,>=,=,between..and 时会提示SQL语法错误,而是经常是查不出一条记录来,还会出现似乎是莫名其妙的结果来,其实您只要理解好...
  • Oracle rownum函数

    万次阅读 2019-04-03 20:27:43
    rownum函数是oracle中常用到的一个返回编号的函数,系统会按顺序分配为从查询返回的行的编号,返回的第一行的编号是1,第二行是2等等,这个函数可以用来限制查询返回的总行数,也就是获取第几行到第几行的数据。...
  • rownumoracle才有的写法,rownumoracle中可以用于取第一条数据,或者批量写数据时限定批量写的数量等 mysql取第一条数据写法 SELECT * FROM t order by id LIMIT 1; oracle取第一条数据写法 SELECT * FROM t ...
  • oracle rownum用法

    2011-09-06 14:25:33
    对于rownum来说它是oracle系统顺序分配为从查询返回的行的编号,返回的第一行分配的是1,第二行是2,依此类推,这个伪字段可以用于限制查询返回的总行数,且rownum不能以任何表的名称作为前缀。 (1) rownum 对于...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 34,971
精华内容 13,988
关键字:

oraclerownum取第一条