Oracle“(+)”运算符

2izufjch  于 2022-12-26  发布在  Oracle
关注(0)|答案(4)|浏览(181)

我正在检查一些旧的SQL语句,目的是记录它们并可能增强它们。
数据库管理系统为Oracle。
我不理解这样一个声明:

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

我对(+)操作符感到困惑,在任何论坛都找不到它...(在引号中搜索+也不起作用)。
无论如何,我使用了SQLDeveloper的“解释计划”,我得到了一个输出,说HASH JOIN, RIGHT OUTER等等。
如果我在查询末尾删除(+)操作符,会有什么不同吗?数据库是否必须满足某些条件(如具有某些索引等)才能使用(+)

vbopmzt1

vbopmzt11#

这是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也建议不要使用它:
Oracle建议您使用FROM子句OUTER JOIN语法,而不是Oracle联接运算符。使用Oracle联接运算符(+)的外部联接查询受以下规则和限制的约束,这些规则和限制不适用于FROM子句OUTER JOIN语法:

vc9ivgsu

vc9ivgsu2#

在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'的所有数据,而不会丢失其数据。

相同查询的现代标准语法为

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

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

如果要使查询成为右连接

这与LEFT JOIN相同,但是切换哪个表是可选的。

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

6tr1vspr

6tr1vspr3#

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

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

因此,简而言之,删除(+)可能会产生显著性差异,但您可能暂时不会注意到,这取决于您的数据!

mnemlml8

mnemlml84#

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

相关问题