记一次sql union 使用场景记录 ゝ一纸荒年。 2022-10-08 05:52 126阅读 0赞 这篇博客估计只有自己看得懂了,里面涉及很多具体业务属性无法说明,作为自己处理的一个记录 最近在一次开发中,一个问题弄了三天,最后通过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 = '' 完美解决问题。
还没有评论,来说两句吧...