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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 14:06:04