zoukankan      html  css  js  c++  java
  • oracle中的rowid--伪列-删除表中的重复内容-实用

    1、rowid是一个伪列,是用来确保表中行的唯一性,它并不能指示出行的物理位置,但可以用来定位行。

    2、rowid是存储在索引中的一组既定的值(当行确定后)。我们可以像表中普通的列一样将它选出来。
    3、利用rowid是访问表中一行的最快方式。
    4、rowid需要10个字节来存储,显示为18位的字符串。
    rowid的组成结构为: 
    data object number(6位字符串) relative file number(3位字符串) block number(6位字符串) row number(3位字符串),如:AAANS3AABAAAPPqAAA
    5、我们可以借助oracle提供的包dbms_rowid,来对rowid进行解析从而获取关于行的相关信息:
    SQL>select
    2 rowid, 
    3 dbms_rowid.rowid_object(rowid) obj_id, 
    4 dbms_rowid.rowid_relative_fno(rowid) df#, 
    5 dbms_rowid.rowid_block_number(rowid) blknum, 
    6 dbms_rowid.rowid_row_number(rowid) rowno 
    7 from t;
    一般来说,当表中的行确定后,rowid就不会发生变化。
    但当如下情况发生时,rowid将发生改变: 
    1、对一个表做表空间的移动后 
    2、对一个表进行了EXP/IMP
    rowid的实际应用
    在Oracle中如何利用Rowid查找和删除表中的重复记录
    现看看我的一个简单表的内容:
    如果我利用命令:delete from t2 where a='zongjun';的话,两行内容将全部删掉,而我想删掉其中的一行内容呢?
    查看表的rowid:
    利用不同的rowid删除指定的行:
    这样我们就删掉了重复的内容,请记住rowid是完全不一样的。
    但是这样只能适合数据少的表,但是在大型的数据库当中,一个表可能有上千万行的内容,因此我们不可能一条一条的去查找并且删除。我们可以利用min(rowid)或max(rowid)来保留一条重复的内容,删除其余所有的重复内容;如下表
    SQL> select * from tt;
            ID NAME
    ---------- --------
             1  zzj
             2  wang
             3  li
             1  zzj
             1  zzj
             1  zzj
             1  zzj
             1  gang
             1  gang
    以上有很多内容是相同的,现在要删除完全一样的内容,各自保留一行即可:
    SQL> delete from tt where tt.rowid not in (select min(rowid) from tt group by id,name);
    5 rows deleted.
    SQL> select * from tt;
            ID NAME
    ---------- --------
             1 zzj
             2 wang
             3 li
             1 gang
    5行已被删除,但是现在还有id一样的行,要保留一行,如下
    SQL> delete from tt where tt.rowid not in (select min(rowid) from tt group by id);
    1 row deleted.
    SQL> select * from tt;
            ID NAME
    ---------- --------
             1 zzj
             2 wang
             3 li
    其中的min(rowid)可以换成max(rowid),这样将会保留最大的rowid,而删除其他的。这里只能利用函数min和max保留最大或者最小的。
  • 相关阅读:
    OGRE 3D 1.7 Beginner‘s Guide中文版 第一章
    一个人的成功取决于晚上的8点至10点--经典语录必读
    学历代表过去、能力代表现在、学习力代表未来
    理财达人五步走
    Ogre场景、节点、摄像机通过自动、鼠标、键盘控制移动
    QT按钮背景颜色设置及文字显示位置设置
    Qt一个工程调用另一个工程的类成员变量
    C++搜索字符串中的汉字
    Q窗口操作函数(窗口最大化,全屏,隐藏最大化最小化按钮)
    PAT(Advance Level)Practice1001
  • 原文地址:https://www.cnblogs.com/qiumingcheng/p/5561416.html
Copyright © 2011-2022 走看看