刪除重複資料

 最近,在查詢資料庫中數據時,發現因為之前在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是在排列之後再加上條件.

原文地址:https://www.cnblogs.com/chengfan2008/p/2164639.html