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
相关产品推荐
相关产品推荐

