关于leftjoin or多条件改写成union的bug
sql吧
全部回复
仅看楼主
level 1
A leftjoin B on A.a1=B.b1 or A.a2=B.b2
改写成union
A leftjoin B on A.a1=B.b1
union
A leftjoin B on A.a2=B.b2
但这样原本一条记录假设a1=b1,但a2!=b2
本来这条记录不会生成null的记录因为满足了a1=b1的条件
改写后第一个leftjoin是
正确的
,但第二个因为a2!=b2 导致最后出了一条有null值的记录
这样就和原本的sql结果集对不上了[怒]
有没有解决办法啊,救救孩子[泪][泪]
2024年04月23日 12点04分 1
level 1
按照道理这么常见的问题应该随便搜出来啊,咋网上都没有啊[狂汗][狂汗][狂汗]还是说本来leftjoin就不能改写union[阴险]那些说改写的自己错了都不知道[阴险]
2024年04月23日 12点04分 2
level 4
这样改写应该是没有问题的
从原理上分析:A leftjoin B,就是遍历A表的所有数据,每一条都去和B表中的每一条一一比较,按on的条件去判断是否连接。最终结果在记录条数上,最少为A表的数量,最多等于A表记录数 * B表记录数。
在这个例子中,on的条件是A.a1=B.b1 or A.a2=B.b2,也就相当于先用第一个条件遍历A表去匹配B表的数据,然后再用第二个条件遍历A表去匹配B表的数据,两次得到的结果叠加,再去重,那不就是改写之后的语句吗?
之所以能这样叠加,是因为on的条件中使用的是 or 而不是 and。如果原本的left join 语句的on条件使用的是and,那么这样叠加确实会产生多余的数据。从你反馈的问题来看,更像是在on条件中使用了and,导致改写后的结果不一致。
如果确定原本的语句就是 A leftjoin B on A.a1=B.b1 or A.a2=B.b2 ,那么请给出实际数据的例子供分析参考
2024年07月03日 03点07分 3
@df3013 回头又重新思考了一遍,这样改写确实有问题。不是没去重的问题,而是可能产生一些只有A表数据且B表数据全部为null的记录。原因是A表中某些只满足其中一个条件的记录,在改写前总能关联到B表中的数据,但改写后因其中一个条件不满足,就会产生一条B表数据全为null的记录
2024年10月19日 01点10分
他没去重
2024年10月15日 10点10分
level 1
union的其中一段不要用left join就好了,,,
2024年07月05日 08点07分 4
level 7
用子查询
2024年10月16日 09点10分 5
level 6
用并还连接干嘛?
2024年12月12日 09点12分 6
1