LEFT JOIN多条件关联与WHERE条件的差异及优劣对比
SQL LEFT JOIN 条件位置差异问题解析
示例SQL代码
示例1:条件写在JOIN ON子句中
FROM table1 LEFT JOIN table2 ON table1.id = table2.id AND table2.flag = TRUE
示例2:条件写在WHERE子句中
FROM table1 LEFT JOIN table2 ON table1.id = table2.id WHERE table2.flag = TRUE
Q1:两段查询返回的行数是否一致?若不一致,原因是什么?
行数肯定不一致,核心原因是左连接的匹配逻辑,加上条件放置的位置优先级不同:
- 示例1里,
table2.flag = TRUE是跟在JOIN的ON后面,相当于先把table2里flag为TRUE的行挑出来,再和table1做左连接。不管table1里的行能不能匹配到符合条件的table2数据,table1的所有行都会保留,匹配不到的话table2的字段就显示NULL。 - 示例2里,
table2.flag = TRUE是放在WHERE里,相当于先把table1和table2全量左连接(table1所有行都留着,匹配不到的table2字段是NULL),之后再过滤结果。这时候table2.flag = TRUE会把那些table2字段为NULL的行直接删掉,最后结果其实和用INNER JOIN是一样的,只留table1和table2 id匹配、且table2 flag为TRUE的行。
Q2:哪种写法更适合实际业务场景?
得看你实际业务需求来选:
- 如果要保住table1的所有数据,同时只关联table2里flag为TRUE的内容(没匹配到的就显示NULL),就用示例1的写法。比如统计所有用户的已完成订单情况,哪怕某个用户没有已完成订单,也要把这个用户的信息留在结果里。
- 如果只需要同时在table1和table2里存在、且table2 flag为TRUE的数据,就用示例2的写法(其实这时候直接写成INNER JOIN会更明白,别人看代码一眼就懂逻辑)。比如筛选出有已完成订单的用户,以及他们对应的订单信息。
内容的提问来源于stack exchange,提问作者Katsu
相关产品推荐
相关产品推荐

