Oracle“(+)”运算符

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

DBMS是Oracle

我不明白这样的陈述:

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

我对(+)操作符感到困惑,无法在任何论坛上find它(search引号内的内容也不起作用)。

无论如何,我使用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之间的区别 。


还应该注意的是,即使(+)有效, Oraclebuild议不要使用它 :

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

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

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

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

实际上,+符号直接放置在条件语句和可选表(允许在条件内包含空值或空值的那一边)的一侧。

在Oracle中,(+)表示JOIN中的“可选”表。 所以在你的查询中,

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

这是一个左'外'加'B'表与'一个表。 就像现代的左连接查询一样。 (它将返回'a'表的所有数据,而不会丢失在另一边的数据可选表'b'可以丢失他的数据) 在这里输入图像描述

 select a.id, b.id, a.col_2, b.col_2, ... from a Left join b ON a.id=b.id 

要么

 select a.id, b.id, a.col_2, b.col_2, ... from a Left join b using(id) 

现在如果你删除(+),那么这将是正常的内部连接查询,

 select a.id, b.id, a.col_2, b.col_2, ... from a,b where a.id=b.id 

在这里输入图像描述

它只会返回所有'a'和'b'表'id'值相同的数据,意味着通用部分。

额外:如果你想让你的查询作为正确的join旧的格式或现代,那么它将显示为如下所示:

在这里输入图像描述

旧:

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

现代:

 select a.id, b.id, a.col_2, b.col_2, ... from a Right join b ON a.id=b.id 

要么

 select a.id, b.id, a.col_2, b.col_2, ... from a Right join b using(id) 

参考和帮助:

https://asktom.oracle.com/pls/asktom/f?p=100:11:::::P11_QUESTION_ID:6585774577187

左外部在Oracle 11g中使用+符号join

https://www.w3schools.com/sql/sql_join_left.asp