Oracle的加号(+)符号和ansi JOIN符号之间的区别?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (56)

使用oracle的加号符号(+)与ANSI标准join符号之间有什么区别?

性能有差异吗?

加号表示法是否被弃用?

提问于
用户回答回答于

AFAIK,这个(+)符号只是为了向后兼容而存在,因为Oracle在加入ANSI标准之前已经推出了它。这是Oracle特有的,如果存在等效的符合标准的版本,则应避免在新代码中使用它。

Oracle建议您使用FROM子句OUTER JOIN语法而不是Oracle连接运算符。使用Oracle连接运算符的外连接查询(+)受以下规则和限制的限制,这些规则和限制不适用于FROM子句OUTER JOIN语法:

  • 您不能(+)在包含FROM子句连接语法的查询块中指定运算符。
  • (+)操作者可以只出现在WHERE条款,或在左相关的上下文中(指定时TABLE的条款)FROM条款,并且只能被应用到的表或视图的一列。
  • 如果A和B由多个连接条件连接,则必须(+)在所有这些条件中使用操作符。如果您不这样做,那么Oracle数据库将只返回由简单连接产生的行,但没有警告或错误,通知您没有外部连接的结果。
  • (+)如果您在外部查询中指定一个表,并在内部查询中指定另一个表,则该运算符不会生成外部联接。
  • (+)尽管自联接有效,但不能使用运算符将表外连接到自身。

例如,以下语句无效:

SELECT employee_id, manager_id
FROM employees
WHERE employees.manager_id(+) = employees.employee_id;

但是,以下自加入有效:

SELECT e1.employee_id, e1.manager_id, e2.employee_id
FROM employees e1, employees e2
WHERE e1.manager_id(+) = e2.employee_id;
  • (+)运算符只能应用于列,而不能应用于任意表达式。但是,任意表达式可以包含一个或多个用(+)操作符标记的列。
  • WHERE包含(+)运算符的条件不能与使用OR逻辑运算符的其他条件组合。
  • WHERE条件不能使用IN比较条件,比较标有一列(+)带表达式运算符。

如果WHERE子句包含将表B中的列与常量进行比较的条件,则(+)必须将该操作符应用于该列,以便Oracle返回表A中已为其生成空值的行。否则,Oracle只返回简单连接的结果。

在执行多于两对表的外连接的查询中,单个表可以是仅针对另一个表的空生成表。因此,(+)在A和B的连接条件以及B和C的连接条件中,不能将运算符应用于B的列。请参阅SELECT外连接的语法。

用户回答回答于

从Oracle 10开始,我们仍然支持该标记(我相信11)。它的使用被认为是“老式的”,并且不像ANSI JOIN语法那样可移植数据库。它也被认为具有更低的可读性,但是如果你来自习惯于ANSI JOIN的+背景,则可能需要一点时间。

没有性能差异; 他们正在表达同样的事情。

扫码关注云+社区