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