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结果集对不上了 有没有解决办法啊,救救孩子
这样改写应该是没有问题的 从原理上分析: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 ,那么请给出实际数据的例子供分析参考