假設現在資料庫中有一個人員表(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,接下來就是水到渠成的事了