Oracle左外连接无法返回Table2含Null值行的问题咨询
解决Oracle外连接无法返回Table2中NULL行的问题
嘿,这个问题我之前也踩过坑!核心原因是NULL值的比较特性:在Oracle里,NULL和任何值做=比较的结果都是未知(既不是TRUE也不是FALSE),所以你原来用的table1.col1 = Table2.col1(+)这个外连接条件,根本匹配不上Table2中Col1为NULL的那一行——毕竟没有任何Table1的Col1值能等于NULL嘛。
下面给你两种靠谱的解决方案:
方案1:修改原有(+)外连接的WHERE条件
直接在原有条件基础上,添加对Table2.Col1为NULL的判断,确保这行能被包含进来:
SELECT t1.col1 AS t1_col1, t1.col2 AS t1_col2, t2.col1 AS t2_col1, t2.col2 AS t2_col2 FROM Table1 t1, Table2 t2 WHERE (t1.col1 = t2.col1(+) OR t2.col1 IS NULL);
方案2:使用ANSI标准的外连接语法(更推荐)
Oracle的(+)外连接是旧语法,现在更推荐用ANSI标准的LEFT/RIGHT OUTER JOIN,语法更清晰,也能自动处理NULL行的保留需求。因为你需要保留Table2的所有行,所以有两种写法:
写法A:RIGHT OUTER JOIN
把Table2作为右表,用RIGHT JOIN确保它的所有行都被保留:
SELECT t1.col1 AS t1_col1, t1.col2 AS t1_col2, t2.col1 AS t2_col1, t2.col2 AS t2_col2 FROM Table1 t1 RIGHT OUTER JOIN Table2 t2 ON t1.col1 = t2.col1;
写法B:LEFT OUTER JOIN(更直观)
直接把Table2放在左表位置,用LEFT JOIN自然保留它的所有行:
SELECT t1.col1 AS t1_col1, t1.col2 AS t1_col2, t2.col1 AS t2_col1, t2.col2 AS t2_col2 FROM Table2 t2 LEFT OUTER JOIN Table1 t1 ON t2.col1 = t1.col1;
这两种ANSI语法的效果完全一致,都会返回Table2的全部3行:
- 匹配到Table1的行(4 xxx、7 yyy)会显示对应的Table1数据
- Col1为NULL的行((null) zzz)会保留,对应的Table1列显示为
NULL
内容的提问来源于stack exchange,提问作者user9606909
相关产品推荐
相关产品推荐

