SQL如何查询table1全部记录及table2指定匹配值 修复左连接问题
问题原因
你现有SQL不符合预期的核心问题是:LEFT JOIN 后将右表(table2)的过滤条件写在了 WHERE 子句中,会直接过滤掉左表匹配不上右表的行。LEFT JOIN 后table2没有匹配到的行的b.ac值为NULL,NULL IN ('ac11','ac14') 结果为不成立,这些行就会被剔除,最终效果等价于INNER JOIN,自然拿不到table1的全部记录。
正确写法1(推荐):将右表过滤条件移到JOIN的ON子句中
SELECT a.id, a.amt, b.ac FROM table1 AS a LEFT JOIN table2 AS b ON a.id = b.id AND b.ac IN ('ac11', 'ac14');
这种写法是在关联的时候就先对右表做过滤,只有符合ac值要求的行才会参与关联,关联不上的左表行依然会保留,b.ac字段自动为NULL,完全符合你的预期结果。
正确写法2:保留WHERE子句,补充NULL判断
SELECT a.id, a.amt, b.ac FROM table1 AS a LEFT JOIN table2 AS b ON a.id = b.id WHERE b.ac IN ('ac11', 'ac14') OR b.ac IS NULL;
这种写法是在过滤的时候同时保留「关联上且符合ac要求」、以及「关联不上」的两类行,也能得到预期结果。
结果验证
对应你给出的样例数据,两种写法返回的结果都和你预期的一致:
- A123,400,ac11
- A124,500,空
- A125,600,空
- A126,700,ac14
内容的提问来源于stack exchange,提问作者YZ123
相关产品推荐
相关产品推荐

