mysql 合并两张表数据,按照业务主键去除重复的数据
一、背景介绍:
我们有A、B两张表,两张表来源于两个系统,我们需要将两张表数据合并,并且重复的数据就取B表数据优先。
二、分析:
以往我写HIVE任务,通过rownum 来解决这种问题,但是后来发现我们mysql 不支持这个函数,(扩展:orcale是支持的。当然也可以自己编写储存过程实现,需要的可以自行百度...)
期间想过直接使用A表 union B表,但是union只能对查出的结果集去重,比如我们需要查出全表字段,那么就会把全表字段组合后去重(例如:20个字段),而我们需要的是按照业务主键去重(例如:2个字段)。所以不能使用 union。 不使用distinct、group by也是同样的道理。
后来我想只能多次查询数据最后 UNION了,我们先看一张图。

我们最后需要的数据就是绿色框出来的,这三部分数据,左右两边的数据可以写out join,但是实际的编写的时候发现mysql 也是不支持out join的,最终我们只能老实的写三个查询SQL UNION
1、使用 INNER JOIN 先查交集部分(对应的是中间绿框那个)(这边要注意了,由于我们业务上要求以B表数据为准,所以select 后面的字段都要是B表的)
2、使用LEFT JOIN 查存在于A,并不存在B的部分(对应的是左边绿框那个)
3、使用LEFT JOIN 查存在B,并不存在A的部分(对应的是右边绿框那个)
这三部分数据都是去重后的,最后用UNION 拼接在一起
三、实际SQL
--先查交集部分,由于我们要求交集部分以B表为准,所以结果字段都要是B.
--row1、row2 是去重业务字段,多个写多个
--A.STATUS = '13' 是A表的过滤条件,如果是全量的则不需要
SELECT
B.row1,
B.row2,
B.CREATE_TIME,
B.UPDATE_TIME
FROM
table1 A
inner join table2 B on A.row2=B.row2 and A.row1=B.row1
WHERE
A.STATUS = '13'
UNION
--这边查A表数据,条件是A表的过滤条件+过滤B表存在的数据
SELECT
A.row1,
A.row2,
A.CREATE_TIME,
A.UPDATE_TIME
FROM
table1 A
LEFT join table2 B on A.row2=B.row2 and A.row1=B.row1
WHERE
A.APPLY_STATUS = '13' AND B.relation_id is null
UNION
--这边查B表数据,过滤掉A表存在的数据
SELECT
B.row1,
B.row2,
B.CREATE_TIME,
B.UPDATE_TIME
FROM
table1 A
RIGHT join table2 B on A.row2=B.row2 and A.row1=B.row1
WHERE
A.relation_id is null;
大家如果有好的方法欢迎留言一起学习。
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐


所有评论(0)