PL/SQL带过滤条件的左外连接(+)语法正确性疑问
问题解答
第一个问题:当前语句是否仍然是左外连接?
不是,你现在写的语句会退化为内连接。
原因是:你没有给tbl2.col2 = 12345加(+)标记时,这个条件会在左连接执行完成后对结果集做过滤。左连接中没有匹配到的tbl2行所有字段都是NULL,而NULL和12345做等值比较的结果为UNKNOWN,这部分行都会被过滤掉,最终结果只会保留同时满足ID匹配、且tbl2.col2等于12345的行,和内连接效果一致。
第二个问题:是否需要写作tbl2.col2 = 12345(+)?
是的,如果你要把col2的过滤条件纳入左连接的匹配规则,必须加上(+)标记。
两种写法的效果可以用标准SQL的LEFT JOIN语法做对比,更直观:
你当前的写法等价于(退化为内连接)
select tbl1.ID , tbl1.col1 , tbl1.col2 , tbl2.col1 from table1 tbl1 left join table2 tbl2 on tbl1.ID = tbl2.ID where tbl2.col2 = 12345;
加(+)后的写法等价于(正确左外连接)
select tbl1.ID , tbl1.col1 , tbl1.col2 , tbl2.col1 from table1 tbl1 left join table2 tbl2 on tbl1.ID = tbl2.ID and tbl2.col2 = 12345;
补充注意事项
- Oracle的(+)是老旧的外连接语法,仅支持左、右外连接,不支持全外连接,日常开发更推荐用标准SQL的JOIN语法,可读性更强,也不容易出现漏加(+)的错误。
- 只要使用(+)语法实现左外连接,所有右表的过滤条件都必须加(+)标记,只要有一个右表过滤条件没加(+),整个查询就会退化为内连接。
内容的提问来源于stack exchange,提问作者JD136
相关产品推荐
相关产品推荐

