这篇博客估计只有自己看得懂了,里面涉及很多具体业务属性无法说明,作为自己处理的一个记录
最近在一次开发中,一个问题弄了三天,最后通过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 = ''
完美解决问题。