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

MSSQL添加WHERE子句时如何保留左表全部含NULL值行?

解决LEFT JOIN加条件仍保留左表所有行的问题

这个问题其实是LEFT JOIN里条件放置位置的经典坑!先给你捋清楚逻辑:

当你直接把WHERE tbl2.Code = '00002'加到WHERE子句时,LEFT JOIN后tbl1中那些没匹配到符合条件的tbl2行的记录,其tbl2的所有字段都会是NULL。而NULL和任何值做比较的结果都是不成立的,所以这些行就会被WHERE条件过滤掉,自然留不住tbl1的全部数据。

正确的做法是把tbl2的过滤条件放到LEFT JOIN的ON子句中,这样在关联两张表的时候,就只筛选tbl2里Code为'00002'的行来和tbl1匹配,同时tbl1中没有匹配上的行依然会被完整保留,对应的tbl2字段显示为NULL。

正确的SQL语句

SELECT tbl1.Code, tbl1.Role, tbl2.User, tbl2.DateFrom, tbl2.DateTo
FROM tbl1 
LEFT JOIN tbl2 
  ON tbl1.Code = tbl2.RoleCode 
  AND tbl2.Code = '00002' -- 将条件移至ON子句,而非WHERE

错误写法的对比(为什么不行)

如果用这种错误写法:

SELECT tbl1.Code, tbl1.Role, tbl2.User, tbl2.DateFrom, tbl2.DateTo
FROM tbl1 LEFT JOIN tbl2 ON tbl1.Code = tbl2.RoleCode
WHERE tbl2.Code = '00002'

你会发现结果里只剩tbl1中Code为0001、0002的行,0003、0004、0005的行全被过滤了,完全达不到保留tbl1所有行的需求。

而用正确写法后,查询结果会保留tbl1的全部5行数据:0001、0002显示匹配到的tbl2数据,0003、0004、0005对应的tbl2字段则为NULL。

内容的提问来源于stack exchange,提问作者Glenn

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:27:10