zoukankan      html  css  js  c++  java
  • Oracle中的rownum 和rowid的用法和区别

    1.rownum是伪列,是在获取查询结果集后再加上去的 (获取一条记录加一个rownum)。对符合条件的结果添加一个从1开始的序列号。

       eg:  

    select rownum,phone_no from ur_user_info where rownum < 6;

    attention:

      rownum是动态的,必有查询结果,然后再给查询的结果集添加上这个列。  例如:第一条记录的rownum是1 ,第二条是2,以此类推。 

    select rownum, phone_no from ur_user_info where rownum > 5 and rownum < 10;  ---查询结果为空集

    当产生结果集时,oracle会产生一条rownum为1的记录,显然不符合条件;那么就会产生第二条记录,同样rownum=1,也不符合记录;  一直下去,导致最后上述sql产生的结果集时空集。 

    如果需要查询到结果,需要使用子查询:

    -----错误写法:
    select
    rownum, phone_no from (select rownum rn , phone_no from ur_user_info ) a where a.rownum > 5 and a.rownum < 10;
    select rownum,*
      from (select rownum rn, a.* from ur_user_info a where rownum < 10) a
     where a.rn > 5;
    
    --注意: 1.rownum只能用< 或者<=             2. <或者<=今年放在子查询里面

    2.rowId伪列

    rowid是物理存在的,实际存在的一个列,是一种数据类型。 基于64为编码的18个字符来唯一标识的一条记录的物理位置的一个ID。   

    唯一标识出对应的存储的物理位置, 类似hashcode值。

    attention:rowid并未存储在表中,所以不支持增删改操作,只能用户查询。

     

    select row_id ,phone_no from ur_user_info where rowid > 5 and rowid < 10;

    实际应用场景:数据去重--当多条记录主键相同或者多条记录完全一致时,只需要留下一条记录。(账单表中出现多条一样的数据)

    delete from bal_acctbook_info
     where rowid not in (select min(rowid)
                           from bal_acctbook_info
                          where balance_id = '4012562452'
                            and op_time = '20171212111111');

    -----明天上线,给自己买了一份重大疾病保险,但愿一切平安。

  • 相关阅读:
    poj 3068 Bridge Across Islands
    XidianOJ 1086 Flappy v8
    XidianOJ 1036 分配宝藏
    XidianOJ 1090 爬树的V8
    XidianOJ 1088 AK后的V8
    XidianOJ 1062 Black King Bar
    XidianOJ 1091 看Dota视频的V8
    XidianOJ 1098 突击数论前的xry111
    XidianOJ 1019 自然数的秘密
    XidianOJ 1109 Too Naive
  • 原文地址:https://www.cnblogs.com/whut-helin/p/8024860.html
Copyright © 2011-2022 走看看