今天遇到一個問題,數據表的數據有重復的,關鍵原因在於新增數據時,沒有根據條件先判斷數據是否存在,當數據存在時進行有關條件的更新,不存在時做新增數據。
對於表中已經存在的數據處理辦法的方法:
1.先根據條件進行統計數據重復率。
2.查詢那一些數據是重復的,將重復數據放在一張表中用於條件對比將源數據中的重復數據刪除(mysql中使用一張表,sqlserver中可以使用臨時表或者表變量存放數據)。
3.根據條件關聯將重復數據刪除。
可以先查詢重復數據的總數:
select sum(count) from( select bidsectioncode,count(bidsectioncode) as count from businessdata.business_bidsection group by bidsectioncode having count>1 order by create_time desc ) as d;
查出數據庫中的重復記錄的數據中的一條,這個不難,很簡單的,sql語句如下:
select * from businessdata.business_bidsection where bidsectioncode in (select bidsectioncode from businessdata.business_bidsection group by bidsectioncode having count(bidsectioncode) > 1) and id in (select min(id) from businessdata.business_bidsection group by bidsectioncode having count(bidsectioncode)>1)
這些都是不重復的,換句話說都是要保留的,不被刪掉的,而其余與這些結果中name相同的應該被刪掉。
也就是說將上邊那個sql語句id后邊加一個not ,查出來的結果就是要刪掉的。
select * from businessdata.business_bidsection where bidsectioncode in (select bidsectioncode from businessdata.business_bidsection group by bidsectioncode having count(bidsectioncode) > 1) and id not in (select min(id) from businessdata.business_bidsection group by bidsectioncode having count(bidsectioncode)>1)
我把這些需要刪掉的存到另外一個表里,然后我新建一個business_bidsection_test表,結構復制business_bidsection的結構就好了。
復制一個創建語句到test表中。
然后將重復數據添加到test表中,插入語句是:
insert into business_bidsection_test (select * from businessdata.business_bidsection where bidsectioncode in (select bidsectioncode from businessdata.business_bidsection group by bidsectioncode having count(bidsectioncode) > 1) and id not in (select min(id) from businessdata.business_bidsection group by bidsectioncode having count(bidsectioncode)>1));
那接下來做的就是刪掉business_bidsection表里邊與business_bidsection_test表的id相同的數據。
delete a.* from business_bidsection a, business_bidsection_test b where a.id = b.id ;
這樣的結果就是完全不重復的,但是id是不連續的。