最近,在查詢資料庫中數據時,發現因為之前在table中未設置唯一鍵,使得有很多資料重復,現需刪除重復的資料,可又需要將其中的一筆保留,先思索了一翻,自已也嘗試著去寫這樣的語句,可寫時還是有些問題,上網查詢了一些資料,發現如下的sql用起來真的很不錯。
1.針對於相應欄位先查詢有重復的欄位資料
select c1,c2,c3 from tabaname group by c1,c2,c3 having(count(*)>1);
2.查詢重復的資料對應的rowid但卻排除最上面的一筆
select rowid from tablename where (c1,c2,c3) in (select c1,c2,c3 from tabaname group by c1,c2,c3 having(count(*)>1))
3.創建一個Table用來記錄rowid(感覺用來創建一個table用來記錄時刪除更有效率)
create table recordrowid as ( select rowid from tablename where (c1,c2,c3) in (select c1,c2,c3 from tabaname group by c1,c2,c3 having(*)>1 and rowid not in(select min(rowid) from tablename group by c1,c2,c3 having count(*)>1)));
4.刪除重復應記錄檔
delete tablename where rowid in(select * from recordrowid );
總結:
1.在開始建立Table時一定要考慮到唯一鍵,以免後繼有不必要的麻煩
2.在Oracle資料庫中每一筆資料它有自己的rowid,通過它來查找資料也不失為一種好的方式.
3.用會用having條件語句,它與Where語句類似,其最大的區別在於where是在加完條件之後進行排列,而having是在排列之後再加上條件.