2010-10-26 61 views
117

我正在检查一些旧的SQL语句,以便记录它们并可能增强它们。Oracle“(+)”运算符

的DBMS是Oracle

我不明白上面写着这样的语句:

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

我感到困惑的(+)运营商,并且在任何论坛上无法得到它... ...(在引号内搜索+也不起作用)。

反正我用“解释计划”的SQLDeveloper的,我得到的输出说HASH JOIN, RIGHT OUTER

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

谢谢!

回答

147

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

的查询将被重新写在ANSI-92语法:

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

This link is pretty good at explaining the difference between JOINs


还应当指出的是,即使(+)作品,Oracle recommends not using it

Oracle建议您使用FROM条款OUTER JOIN语法,而不是甲骨文加入经营者。外连接是使用Oracle联接运算符(+)受到以下规则和限制,并不适用于FROM条款OUTER JOIN语法查询:

+0

哦谢谢! - 根本没有期待! – Sekhar 2010-10-26 04:56:22

+60

没错。为了保持(+)直线在我的脑海中(左侧和右侧),我喜欢将(+)看作“如果找不到匹配就添加NULL值”。例如,“a.id = b.id(+)”表示如果与a.id不匹配,则允许b.id为NULL。 – beach 2010-10-26 05:00:05

+0

谢谢..我猜想从from子句中添加它应该会得到相同的结果! – 2013-02-19 08:03:05

24

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

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

因此,在短期,去除(+),可以使一个显着性差异,但是这取决于你的数据,你可能不会注意到了一段时间!

5

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

8

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

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

它是一个左'外'加'表'与'一'表。就像现代的左连接查询一样。 (它会回报不失去对对方可选表“B”可以失去了数据的数据“一”表的所有数据) enter image description here

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

OR

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 

enter image description here

它只会返回'a'&'b'表'id'值相同的所有数据,表示公用部分。

外:如果你想使你的查询作为权旧格式或现代再加入它会出现像波纹管:

enter image description here

老:

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 using(id) 

参考&帮助:

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

Left Outer Join using + sign in Oracle 11g

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