指定字段去重(背景:多張結構相同的表通過某一個或多個字段去重清洗。邏輯:按照要求創建一個空白表准備往里面灌入多個表的數據——第一個表通過group by去重后插入——第二張表找到第一張表里面沒有的去重字段——將第二張表的去重字段插入到第一張表中——然后根據插入后的第一張表的去重字段更新數據將第二張表的新數據更新進去。。。。往后的每張表一次類推。簡單理解就是用后面的表數據更新前面的表數據,先插入關鍵字段(也就是去重字段),只插入前表沒有的數據,然后再通過前表關鍵字段補齊數據。再換句話說就是先只插入沒有的關鍵字段,然后再補全數據)
做法:
1.插入關鍵字段
insert into 目標表 (關鍵字段*如身份證)
select 關鍵字段 from 新表 as a
where not exists (select 1 from 目標表 as b where a.關鍵字段 = b.關鍵字段)
group by 關鍵字段 -- 這個關鍵字段新表的
2.更新數據
update 目標表 as a inner join
(select max(字段1) as 原表字段,max(字段2) as 原表字段,關鍵字段 as 原表字段,max(字段4) as 原表字段。。。 from 新表 group by 關鍵字段) as b on a.關鍵字段 = b.關鍵字段(因為都as了原表的字段所以b表這里的關鍵字段和a表是一樣的) -- 這里說個重點一定要是每個字段都 as 原表,這樣可以保證原結構插入,但是新表要是沒有那個字段就要 NULL替換max(XXX)將空數據帶進去,另外注意關鍵字段(也就是group by字段)不要max,不然沒法去重了。
set
a.字段1 = b.字段1,
a.字段2 = b.字段2,
a.字段3 = b.字段3,
a.字段4 = b.字段4,
a.字段5 = b.字段5,
a.字段6 = b.字段6;
這里除了自增字段所有字段都需要更新,包括關鍵字段。而且不論a表的字段還是b表的字段都是原表的字段都是一樣的。