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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM