当前位置:  开发笔记 > 数据库 > 正文

Oracle"(+)"运算符

如何解决《Oracle"(+)"运算符》经验,为你挑选了4个好方法。

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

DBMS是Oracle

我不明白这样的陈述:

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

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

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

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

谢谢!



1> OMG Ponies..:

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

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

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

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


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

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


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

2> 小智..:

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

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

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



3> Md. Salman F..:

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

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

它是一个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

要么

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'值相同的所有数据,意味着共同的部分.

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

在此输入图像描述

旧:

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

要么

SELECT  a.id, b.id, a.col_2, b.col_2, ...
FROM a,b
WHERE 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



4> 小智..:

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

推荐阅读
赛亚兔备_393
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有