最近在项目里看到有这种错误写法
SELECT
t1.col1,
t2.col2
FROM
table1 AS t1
LEFT JOIN table2 AS t2
ON t1.key1 = t2.key3
AND t1.key2 = t2.key4
WHERE
t1.key1 = '1'
AND t1.key2 = '2'
AND t2.col3 = '3'
;
上面这段代码乍看没什么问题,但实则大错特错
LEFT JOIN
的逻辑本来是如果t2里面符合条件的数据不存在,不会影响取得t1的值,但这条SQL语句的结果是如果t2里面取不到值,整个SQL取得行数为0。
这是因为SQL的执行顺序是先进行JOIN生成临时表,JOIN之后再用WHERE后面的条件过滤临时表。当t2不存在符合条件(ON之后的条件)的数据时,再使用t2.col3 = '3'
来过滤数据的话,即使t1中可以取得数据,也会导致取得结果为0件。
那么这个地方应该怎么改呢?将AND t2.col3 = '3'
这个条件放在ON后即可。
SELECT
t1.col1,
t2.col2
FROM
table1 AS t1
LEFT JOIN table2 AS t2
ON t1.key1 = t2.key3
AND t1.key2 = t2.key4
AND t2.col3 = '3'
WHERE
t1.key1 = '1'
AND t1.key2 = '2'
;
以上。