• 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');

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

  • 相关阅读:
    [swustoj 411] 售货员的难题
    白书P61
    白书P60
    [ZOJ 3471] Most Powerful
    [HDU 3001] Travelling
    [转] acmer必看的26个对acm态度
    [HDU 1254] 推箱子
    [POJ 3311] Hie with the Pie
    [POJ 3254] Corn Fields
    power
  • 原文地址:https://www.cnblogs.com/whut-helin/p/8024860.html
Copyright © 2020-2023  润新知