SQL LEFT JOIN查询异常:如何实现从table1查询全部数据并关联table2的指定列?
解决你的LEFT JOIN查询问题
嘿,我一眼就看出你的SQL哪里出问题了——你把LEFT JOIN的关联条件放在了WHERE子句里,这直接改变了LEFT JOIN的行为,导致没达到预期效果!
问题所在
LEFT JOIN的核心是保留左表(table1)的所有行,哪怕右表(table2)没有匹配的数据。但你用WHERE B.code = A.code的时候,那些table2里没有匹配的行中,B.code会是NULL,而NULL = A.code的结果是不成立的,这些行就会被过滤掉,最后结果其实和INNER JOIN一样,完全丢失了你想要保留的table1全部数据。
正确的写法
把关联条件放在ON子句里,这是LEFT JOIN的标准用法,能完美实现你的需求:
SELECT A.*, B.category FROM table1 A LEFT JOIN table2 B ON B.code = A.code;
这样执行的话,table1的每一行都会被返回:
- 如果table2里有
code和A.code匹配的行,就会把对应的category列带上; - 如果没有匹配的行,
B.category就会显示为NULL,但table1的所有数据都会被保留。
额外提示
如果你还有其他过滤条件(比如只想保留table1中状态为活跃的行),可以把这些条件放在WHERE子句里,但关联条件一定要留在ON里,比如:
SELECT A.*, B.category FROM table1 A LEFT JOIN table2 B ON B.code = A.code WHERE A.status = 'active';
内容的提问来源于stack exchange,提问作者Richard Johnson
相关产品推荐
相关产品推荐

