今天在导数据的过程中发现,在LEFT JOIN的过程中,多个匹配条件的结果个数不对。
比如有三张表A, B, C,在A left join B leftjoin C的过程中,总的数量应该与表A个数相同,但是当有多个匹配条件时,发现结果的个数不对,经过排查,原来原因出在where上。
开始写的语句类似于:
SELECT * FROM A
LEFT JOIN B ON A.field1 = B.field1
LEFT JOIN C ON A.field2 = C.field2 AND B.field3 = C.field3 WHERE C.field4 > 1;
结果比A的行数少。
原因在与,sql在执行LEFT JOIN的时候会先整体处理ON后面的条件进行拼接,之后在处理WHERE后面的条件进行筛选,而两者的执行方式是不一样的,ON在右表匹配不到时,会添加一个NULL,而WHERE在匹配不到时会过滤掉该行,造成结果比预想的少。
一个处理方式是,根据ON和WHERE的处理逻辑谨慎选择两者,比如上面的例子其实可以写成:
SELECT * FROM A
LEFT JOIN B ON A.field1 = B.field1
LEFT JOIN C ON A.field2 = C.field2 AND B.field3 = C.field3 AND C.field4 > 1;