Oracle“(+)”操作符

我正在检查一些旧的 SQL 语句,以便对它们进行文档化,并可能对它们进行增强。

数据库管理系统是 Oracle

我不明白这样一句话:

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

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

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

如果在查询的末尾删除 (+)操作符,会有什么不同吗?在使用 (+)之前,数据库是否必须满足某些条件(如具有某些索引等) ?如果你能提供我一个简单的理解,或一些好的链接,我可以阅读有关这将是非常有帮助的。

谢谢!

283528 次浏览

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

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

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

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


还应该注意的是,即使 (+)工作,Oracle 建议使用 < strong > not :

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(+)

因此,简而言之,删除(+)可能会产生显著性差异,但是根据您的数据,您可能有一段时间不会注意到这一点!

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

在 Oracle 中,(+)表示 JOIN 中的“可选”表,

SELECT a.id, b.id, a.col_2, b.col_2, ...
FROM a,b
WHERE a.id=b.id(+)

它是表‘ b’到表‘ a’的左外连接。当另一端(可选的表‘ b’)没有数据时,它将返回表‘ a’的所有数据,而不会丢失其数据。

Diagram of Left Outer Join

同一个查询的现代标准语法是

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

或者使用 a.id=b.id的简写(不是所有数据库都支持) :

SELECT  a.id, b.id, a.col_2, b.col_2, ...
FROM a
LEFT JOIN b USING(id)

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

在 Oracle 和其他数据库中的旧语法:

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
INNER JOIN b ON a.id=b.id

或者简单地说:

SELECT  a.id, b.id, a.col_2, b.col_2, ...
FROM a
JOIN b ON a.id=b.id

Diagram of Inner Join

它只返回‘ a’和‘ b’表‘ id’值相同的所有数据,即公共部分。

如果要将查询设置为右连接

这与左连接(LEFT JOIN)相同,但是可以切换哪个表是可选的。

Diagram of Right Outer 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

参考及帮助:

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