指定字段去重(背景:多张结构相同的表通过某一个或多个字段去重清洗。逻辑:按照要求创建一个空白表准备往里面灌入多个表的数据——第一个表通过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表的字段都是原表的字段都是一样的。