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

Oracle语句中(+)的作用是什么?outerjoin的用途及差异咨询

Oracle 外连接(+)语法及特定场景分析

1. Oracle语句中(+)的作用是什么?

(+)是Oracle独有的旧版外连接语法,用来实现左/右外连接,对应标准ANSI SQL里的LEFT JOIN和RIGHT JOIN:

  • 要是你写a.column = b.column(+),这就是左外连接——左表a的所有行都会被保留,哪怕右表b里找不到匹配的记录,这时候b的未匹配列会显示NULL。
  • 反过来,a.column(+) = b.column就是右外连接——右表b的所有行都留着,左表a没匹配的列填NULL。
  • 提醒一句:这种语法现在已经不推荐用了,Oracle官方建议用标准ANSI JOIN,不仅可读性强,还支持全外连接(FULL JOIN),也不会有(+)不能和OR混用的限制。

2. 语句and trunc(sysdate) between effective_start_date(+) and effective_end_date(+)中外连接的用途及差异

先假设这条语句是在多表关联的WHERE子句里(比如FROM emp e, emp_status es WHERE e.emp_id = es.emp_id(+) AND trunc(sysdate) BETWEEN es.effective_start_date(+) AND es.effective_end_date(+)),咱们拆开说:

用途

这里加(+)的核心目的是保住主表(比如emp)的所有记录,同时只关联子表(emp_status)里那些「当前日期在生效起止区间内」的行:

  • 要是主表的员工在子表中有符合生效日期的状态记录,就把状态数据一起返回;
  • 要是员工没对应的状态记录,或者状态记录的生效日期不包含今天,员工的基础信息照样会被返回,只是状态相关的列显示NULL。

和不用外连接的差异

如果把(+)去掉,写成and trunc(sysdate) between effective_start_date and effective_end_date,结果会完全不一样:

  • 不带(+)的话,只会返回那些有符合条件的状态记录的员工,没有状态记录、或者状态记录过期/未生效的员工都会被过滤掉;
  • 带(+)的话,所有员工都能出现在结果里,哪怕他们没有有效状态记录。

另外要注意:Oracle的(+)语法里,带(+)的条件是作为外连接的关联条件来用的,相当于ANSI语法里把条件写在ON子句里——关联的时候就筛选子表的有效记录;要是不带(+)放在WHERE里,那是关联完所有行之后再过滤掉不符合条件的,这俩逻辑完全不同。

内容的提问来源于stack exchange,提问作者Remo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 20:23:29