记一次sql union 使用场景记录

这篇博客估计只有自己看得懂了,里面涉及很多具体业务属性无法说明,作为自己处理的一个记录

最近在一次开发中,一个问题弄了三天,最后通过sql 中union 使用解决问题。

详细场景无法说明,这里简要说明下大概的使用场景。问题的场景是有三个数据库的数据同步问题。

数据库A 中为初始数据,业务数据有个数据频率frequency,以及所属另一个属性Buuid和Cuuid,D

B和C是多对多的关系,D和C是一对多的关系

但是每个C 一定有一个frequency属性。

从数据库A同步数据到数据库A1 中有个TBL_C_FREQUENCY,这中间每个C属性对应的frequency属性都有比较全。

从数据库A ,A1同步数据到A2数据库中时候,有个数据表TBL_B_C ,TBL_D_C,

数据库中TBL_D_C中数据比较冗余,但是数据库TBL_B_C中数据B对C的数据是有缺失的。

原来的sql中采用的是

TBL_D_C INNER JOIN TBL_B_C 得到的结果,因为TBL_B_C缺失了部分数据,结果有误差。

开始的初步修改采用的是LEFT JOIN

问题所在的部分特殊场景解决了,但是采用全量场景时候发现数据冗余。这个地方处理了好久,一直的想法是无法改用LEFT JOIN ,只能在从数据库A,A1同步A2这里想着去处理,这样的工作量很大。

后来发现TBL_D_C 中如果B 没有,那么其中的BUUID字段是空'',有的话就是具体的BUUID了

于是关键语句采用union连接

SELECT * FROM 

TBL_D_C

LEFT JOIN 

TBL_B_C

ON

TBL_D_C.CUUID = TBL_B_C.CUUID 

WHERE TBL_D_C.BUUID != '' 

UNION 

SELECT 

TBL_D_C  WHERE TBL_D_C.BUUID = ''  

完美解决问题。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值