天天看點

資料庫資料去重

假設現在資料庫中有一個人員表(user),表中包括 主鍵ID,,姓名、身份證号碼、等字段。由于程式的的原因、好來發現表中有許多理論上重複的資料(即姓名、和身份證号相同的資料),現在要求根據身份證号碼和姓名去除表中的重複資料。

    該怎麼做呢,這裡有一個方案可以參考一下:

    select min(id) as id,name,cardId from User group by name,cardId ;

   通過上面的這條Sql語句即可得到一份沒有重複姓名和身份證号的一組資料,當然隻等得到Id、姓名、和身份證号,其實我們真正想要的隻有Id一列而已。因為我們隻要得到沒有重複資料的id就可以找出所有的并且不重複的資料了。

   接下類我們使用嵌套的查詢 得到所有的不重複資料的Id

   select id  from (select min(id) as id,name,cardId from User group by name,cardId ) as a

  得到我們需要的ID之後我們可以有好幾種選擇:1、使用  not IN 删除所有Id不在以上查出的Id範圍的資料。即删除重複的資料

  delete form user where  id not in (select id  from (select min(id) as id,name,cardId from User group by name,cardId ) as a);

使用not in 非常耗費資料庫資源,并且 如果資料量大的話,會非常的慢,可能會慢的難以忍受,是以不建議使用。

 除了可以使用 Not In 之外還可以使用臨時表的方法:

       1、找出所有不重複的資料

       select * into #temp1  from user where id in (select id  from (select min(id) as id,name,cardId from User group by name,cardId ) as a);

  2,删除原表中的所有資料

      delete from user;

     3、将臨時表中的資料在插入會user表

   insert into user  select * from #temp1;

     4,删除臨時表

      drop table #temp1;

萬事開頭難,隻要能想到,通過group by在每組取一個id,接下來就是水到渠成的事了