您现在的位置是:主页 > news > 建设银行网站用户名更改/千锋教育前端学费多少
建设银行网站用户名更改/千锋教育前端学费多少
admin2025/6/17 11:15:56【news】
简介建设银行网站用户名更改,千锋教育前端学费多少,wordpress首页幻灯片设置,建设银行手机个人网站一、背景介绍: 我们有A、B两张表,两张表来源于两个系统,我们需要将两张表数据合并,并且重复的数据就取B表数据优先。 二、分析: 以往我写HIVE任务,通过rownum 来解决这种问题,但是后来发现我…
一、背景介绍:
我们有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表的过滤条件,如果是全量的则不需要
SELECTB.row1,B.row2,B.CREATE_TIME,B.UPDATE_TIME
FROMtable1 Ainner join table2 B on A.row2=B.row2 and A.row1=B.row1
WHEREA.STATUS = '13'UNION
--这边查A表数据,条件是A表的过滤条件+过滤B表存在的数据
SELECTA.row1,A.row2,A.CREATE_TIME,A.UPDATE_TIME
FROMtable1 ALEFT join table2 B on A.row2=B.row2 and A.row1=B.row1
WHEREA.APPLY_STATUS = '13' AND B.relation_id is nullUNION
--这边查B表数据,过滤掉A表存在的数据
SELECTB.row1,B.row2,B.CREATE_TIME,B.UPDATE_TIME
FROMtable1 ARIGHT join table2 B on A.row2=B.row2 and A.row1=B.row1
WHEREA.relation_id is null;
大家如果有好的方法欢迎留言一起学习。