You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 01:15:01