1. 程式人生 > >數據庫刪除重復數據

數據庫刪除重復數據

唯一標識 重復數 max tab 得到 不重復 group by 簡單 row

第一,數據庫中實體重復的解決方法。

實體重復也就是完全重復:即表中兩行記錄完全一樣的情況。這類數據重復就需要刪除一條記錄,解決方法比較簡單,具體操作如下:

使用select distinct * from tableName就可以得到無重復記錄的結果集。
如果該表需要刪除重復的記錄(重復記錄保留1條),可以按以下方法刪除
select distinct * into #Tmp from tableName
drop table tableName
select * into tableName from #Tmp
drop table #Tmp
發生這種重復的原因是表設計不周產生的,增加唯一索引列即可解決。


第二,數據庫中字段重復的解決方法。

字段重復,這類重復問題通常要求保留重復記錄中的第一條記錄,操作方法如下:

方法一:假設有重復的字段為Name要求得到這個字段唯一的結果集
select identity(int,1,1) as autoID, * into #Tmp from tableName
select min(autoID) as autoID into #Tmp2 from #Tmp group by Name
select * from #Tmp where autoID in(select autoID from #tmp2)
最後一個select即得到了Name不重復的結果集(但多了一個autoID字段,實際寫時可以寫在select子句中省去此列,如果要刪除庫裏的重復數據,只要將對應的delectable或drop掉就可以了)。


方法二:保留重復數據中最新的一條記錄,操作方法如下:
在Oracle中,rowid是隱藏字段,用來唯一標識每條記錄。所以,只要保留重復數據中rowid最大的一條記錄就可以了。  
查詢重復數據:
select a.rowid,a.* from 表名 a
where a.rowid != (
select max(b.rowid) from 表名 b
where a.字段1 = b.字段1 and a.字段2 = b.字段2 );   
例:selete from dba_tables a
where a.rowid!=(
select max(rowid) from test b
where a.owner=b.owner);

方法三:刪除重復數據,只保留最新的一條數據,操作方法如下:
delete from 表名 a
where a.rowid != (
select max(b.rowid) from 表名 b
where a.字段1 = b.字段1 and a.字段2 = b.字段2 )

數據庫刪除重復數據