`
wangyanlong0107
  • 浏览: 504500 次
  • 性别: Icon_minigender_1
  • 来自: 沈阳
社区版块
存档分类
最新评论

oracle中的rowid--伪列-删除表中的重复内容-实用

 
阅读更多

转自:http://tech110.blog.51cto.com/438717/168025

 

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保留最大或者最小的。

分享到:
评论

相关推荐

    mysql虚拟了一个rowid(类似跟oracle的rowid)--SQL语句.sql

    mysql虚拟了一个rowid(类似跟oracle的rowid)--SQL语句

    oracle_SQL-rowid--rownum.zip_oracle

    `ROWID`是Oracle数据库中一个特殊的伪列,它为每一行数据提供了一个唯一的物理地址,类似于内存中的指针。`ROWID`由一系列字符组成,表示了数据在数据块中的位置。它包含了表空间、段、区、块以及行在块内的偏移量等...

    Oracle中用Rowid查找和删除表中的重复记录

    ### Oracle中用Rowid查找和删除表中的重复记录 在Oracle数据库管理中,处理重复记录是一项常见的需求,尤其是在数据量较大的情况下。本文将详细介绍如何利用Rowid这一特性来有效地查找和删除表中的重复记录。 ####...

    Oracle数据库rowid深入探析.pdf

    伪列类似于数据表的列,建立表时,数据库会自动为每个表建立rowid列,但它实际上不存储在表中,因此,当用desc命令来查看任何一个表的结构时,都不会显示有rowid这一列存在。 rowid的概念 在Oracle官方文档中,对...

    oracle伪列以与伪表.doc

    3. `ROWID`:这是Oracle中最常用的伪列之一,它是一个唯一标识每条记录物理位置的字符串。虽然不存储在表中,但在查询时可以获取,用于快速定位和访问数据。 4. `ROWNUM`:这个伪列用于限制查询结果集的大小。它会...

    oracle伪列以及伪表.doc

    例如,通过GROUP BY和HAVING子句找出重复记录,然后利用ROWID删除除每个组中最小ROWID(或最大ROWID)之外的所有记录。 四、ROWID的使用示例 1. 创建具有重复数据的表,如`empa`和`dupCityInfo`。 2. 使用GROUP BY...

    Oracle数据库删除表中重复记录的方法三则.txt

    ### Oracle数据库删除表中重复记录的方法 在Oracle数据库管理中,经常会遇到需要处理表中的重复数据的情况。重复数据不仅会占用不必要的存储空间,还可能导致数据统计错误或业务逻辑混乱等问题。因此,掌握如何有效...

    oracle伪列以及伪表.docx

    Oracle数据库系统中,伪列和伪表是两个特殊的概念,它们为数据库操作提供了额外的功能和便利。本文将详细探讨这两个概念及其应用场景。 首先,我们来理解什么是伪列。伪列并非用户在创建表时定义的列,而是Oracle...

    oracle数据库伪列简单介绍

    **rowid** 也是Oracle数据库中的一个重要伪列,它表示表中每行记录的物理地址。与rownum不同的是,rowid对于表中的每一行都是唯一的,并且指向该行数据的实际存储位置。 ##### rowid的特点: 1. **唯一性**:rowid...

    oracle的伪列与分页

    - **定义**:ROWID是Oracle中用于唯一标识表中每一行记录的一个伪列。 - **特性**: - 每个表的每一行都有一个唯一的ROWID值。 - ROWID包含行的实际物理地址。 - 使用ROWID可以快速定位到具体的一行记录,从而...

    oracle_SQL中rowid与rownum的使用

    它是一个伪列,包含了表中每一行的具体位置信息,由一系列字符组成,反映了数据在磁盘上的存储位置。`ROWID`的特点包括: 1. **唯一性**:每个`ROWID`都是唯一的,即使在有重复数据的情况下。 2. **稳定性**:一旦...

    Oracle中查找和删除重复记录方法

    删除重复记录的方法原理:在Oracle中,每一条记录都有一个rowid,rowid在整个数据库中是唯一的,rowid确定了每条记录是在Oracle中的哪一个数据文件、块、行上。在重复的记录中,可能所有列的内容都相同,但rowid不会...

    Oracle中的rowid

    ROWID是ORACLE中的一个重要的概念。用于定位数据库中一条记录的一个相对唯一地址值。通常情况下,该值在该行数据插入到数据库表时即被确定且唯一。ROWID它是一个伪列,它并不实际存在于表中。它是ORACLE在读取表中...

    利用rowid快速在线更新海量数据

    **ROWID** 是 Oracle 数据库中一个非常重要的概念,它是一种特殊类型的列,用于唯一标识表中的一行数据。ROWID 的格式通常包含数据对象号 (Data Object Number)、相对文件号 (Relative File Number)、块号 (Block ...

    17.Oracle伪列1

    在Oracle中,rowid作为一个数据类型,用于存储rowid值。尽管它是10字节,但在处理时,我们可以将其视为18字节的字符串。Oracle会自动进行这种转换,方便用户操作。 3. rowid的应用 - 记录表数据变化:rowid可以用于...

    oracle中如何删除重复数据

    以下将详细解释如何在Oracle中处理这两种类型的重复数据问题:部分字段重复和完全重复记录。 一、部分字段重复数据的删除 1. 查询重复数据: 使用`GROUP BY`和`HAVING`子句可以找出具有相同值的字段组合。例如,...

    oracle查询重复数据方法

    例如,下面的语句可以查询出表中多余的重复记录,并删除重复记录中除了 rowid 最小的记录以外的所有记录: ```sql declare @max integer, @id integer declare cur_rows cursor local for select 主字段, count(*) ...

    oracle_SQL中ROWID与ROWNUM的使用

    在 Oracle SQL 中,`ROWNUM` 是一种特殊的伪列,用于标识查询结果集中的行编号。它常用于实现 TOP-N 查询,即返回结果集中满足特定条件的前 N 条记录。 **特点:** - `ROWNUM` 总是从 1 开始,并且只会随着查询...

Global site tag (gtag.js) - Google Analytics