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

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

  • 相关阅读:
    弹弹弹,走到哪里弹到哪里 —— 关于上海电信强制弹窗广告
    对Live Writer支持的继续改进:设置随笔地址别名(EntryName)
    【公告】6月20日0:00~1:00(今天夜里)机房网络设备调整
    上周热点回顾(6.46.10)
    [功能改进]Live Writer发博支持“建分类、加标签、写摘要”
    上周热点回顾(6.186.24)
    上周热点回顾(6.116.17)
    [转].NET 绘制 EAN13 (商品条码)
    [转]C#连接操作mysql实例
    [转]MySQLHelper类
  • 原文地址:https://www.cnblogs.com/whut-helin/p/8024860.html
Copyright © 2011-2022 走看看