Oracle"(+)"运算符

Sek*_*har 145 sql oracle join outer-join

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

DBMS是Oracle

我不明白这样的陈述:

select ...
from a,b
where a.id=b.id(+)
Run Code Online (Sandbox Code Playgroud)

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

无论如何,我使用了SQLDeveloper的"解释计划",我得到了一个输出说HASH JOIN, RIGHT OUTER,等等.

如果我(+)在查询结束时删除运算符会有什么不同吗?数据库是否必须满足某些条件((+)如有一些索引等)才可以使用?如果你能给我一个简单的理解,或者我能读到的一些好的链接,那将会非常有帮助.

谢谢!

OMG*_*ies 177

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

该查询将以ANSI-92语法重写为:

   SELECT ...
     FROM a
LEFT JOIN b ON b.id = a.id
Run Code Online (Sandbox Code Playgroud)

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


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

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

  • 非常正确.为了保持(+)笔直(左侧与右侧),我喜欢将(+)视为"如果找不到匹配则添加NULL值".例如,"a.id = b.id(+)"表示如果与a.id不匹配,则允许b.id为NULL. (74认同)

小智 26

(+)运算符表示外连接.这意味着即使没有匹配项,Oracle仍会从连接的另一端返回记录.例如,如果a和b是emp和dept,并且您可以将员工取消分配给部门,则以下语句将返回所有员工的详细信息,无论他们是否已分配到部门.

select * from emp, dept where emp.dept_id=dept.dept_id(+)
Run Code Online (Sandbox Code Playgroud)

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


Md.*_*ous 24

在Oracle中,(+)表示JOIN中的"可选"表.所以在你的查询中,

SELECT a.id, b.id, a.col_2, b.col_2, ...
FROM a,b
WHERE a.id=b.id(+)
Run Code Online (Sandbox Code Playgroud)

它是一个LEFT OUTER JOIN'b'表,带有'a'表.就像现代左连接查询一样.(它会返回'a'表的所有数据而不会丢失另一侧的数据可选表'b'会丢失他的数据) 在此输入图像描述

SELECT  a.id, b.id, a.col_2, b.col_2, ...
FROM a
LEFT JOIN b ON a.id=b.id
Run Code Online (Sandbox Code Playgroud)

要么

SELECT  a.id, b.id, a.col_2, b.col_2, ...
FROM a
LEFT JOIN b USING(id)
Run Code Online (Sandbox Code Playgroud)

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

SELECT  a.id, b.id, a.col_2, b.col_2, ...
FROM a,b
WHERE a.id=b.id
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

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

额外:如果您想将查询设置为旧格式或现代的右连接,则它将显示为如下:

在此输入图像描述

旧:

SELECT  a.id, b.id, a.col_2, b.col_2, ...
FROM a
INNER JOIN b ON a.id=b.id
Run Code Online (Sandbox Code Playgroud)

现代:

SELECT  a.id, b.id, a.col_2, b.col_2, ...
FROM a
JOIN b ON a.id=b.id
Run Code Online (Sandbox Code Playgroud)

要么

SELECT  a.id, b.id, a.col_2, b.col_2, ...
FROM a,b
WHERE a.id(+)=b.id
Run Code Online (Sandbox Code Playgroud)

参考和帮助:

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

使用Oracle 11g中的+符号左外连接

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


小智 6

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