左连接中使用WHERE不等于条件导致结果缺失的技术问询
SQL左连接结果缺失问题:原因与解决办法
为什么t2.code != 'value'会过滤掉t1.id=1234的行?
问题出在SQL的三值逻辑上:
- SQL里的
NULL代表“未知值”,它和任何值做比较(包括!=)的结果既不是TRUE也不是FALSE,而是UNKNOWN。 WHERE子句只会保留判断结果为TRUE的行,UNKNOWN的行会被直接过滤。所以当t2中没有匹配行时,t2.code是NULL,这时候t2.code != 'value'的结果是UNKNOWN,这行自然就被排除了。
两种通用的解决办法(无需IIF)
办法1:把过滤条件移到LEFT JOIN的ON子句中
这样只会过滤t2中匹配的行,不会影响t1里无匹配的行:
SELECT t1.id, t2.code FROM table1 t1 LEFT JOIN t2 ON t1.id = t2.id AND t2.code != 'value'
办法2:在WHERE子句中显式包含NULL的情况
直接把NULL的情况加入判断条件,让这类行的结果为TRUE:
SELECT t1.id, t2.code FROM table1 t1 LEFT JOIN t2 ON t1.id = t2.id WHERE t2.code != 'value' OR t2.code IS NULL
这两种写法兼容性更好,几乎所有报表工具都支持,逻辑也更直观。
内容的提问来源于stack exchange,提问作者TheCN
相关产品推荐
相关产品推荐

