Oracle“(+)”运算符怎么用?

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

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

我正在检查一些旧的SQL语句,以便记录它们并可能会加强它们。

DBMS是Oracle

我不明白这样的陈述:

select ...
from a,b
where a.id=b.id(+)

我对(+)运营商感到困惑,无法在任何论坛上获得它(搜索引号内的内容也无效)。

无论如何,我使用了SQLDeveloper的“解释计划”,我得到了一个输出结果HASH JOIN, RIGHT OUTER,等等。

如果(+)在查询结束时删除操作员,会有什么区别吗?数据库是否必须满足某些条件((+)如有一些索引等)才能使用?如果你能给我一个简单的理解,或者我可以阅读关于它的一些很好的链接,这将是非常有帮助的。

提问于
用户回答回答于

这是针对OUTER JOIN的Oracle特定符号,因为ANSI-89格式(在FROM子句中使用逗号分隔表引用)没有标准化OUTER连接。

该查询将被重写为ANSI-92语法,如下所示:

   SELECT ...
     FROM a
LEFT JOIN b ON b.id = a.id

这个链接很好的解释了JOIN之间的区别。

还应该注意的是,即使这些(+)作品,Oracle建议不要使用它:

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

用户回答回答于

(+)运算符指示外部联接。这意味着即使没有匹配,Oracle仍然会从联接的另一端返回记录。例如,如果a和b是emp和dept,并且你可以让员工未分配给某个部门,那么以下语句将返回所有员工的详细信息,而不管他们是否已分配到某个部门。

select * from emp, dept where emp.dept_id=dept.dept_id(+)

简而言之,删除(+)可能会产生显着差异,但根据你的数据,你可能不会注意到一段时间!

扫码关注云+社区