我正在检查一些旧的SQL语句,目的是记录它们并可能增强它们。
数据库管理系统为Oracle。
我不理解这样一个声明:
select ...
from a,b
where a.id=b.id(+)
我对(+)
操作符感到困惑,在任何论坛都找不到它...(在引号中搜索+也不起作用)。
无论如何,我使用了SQLDeveloper的“解释计划”,我得到了一个输出,说HASH JOIN, RIGHT OUTER
等等。
如果我在查询末尾删除(+)
操作符,会有什么不同吗?数据库是否必须满足某些条件(如具有某些索引等)才能使用(+)
?
4条答案
按热度按时间vbopmzt11#
这是Oracle特有的OUTER JOIN表示法,因为ANSI-89格式(在FROM子句中使用逗号分隔表引用)没有标准化OUTER连接。
查询将以ANSI-92语法重写为:
This link is pretty good at explaining the difference between JOINs.
还应注意,即使
(+)
可以工作,Oracle也建议不要使用它:Oracle建议您使用
FROM
子句OUTER JOIN
语法,而不是Oracle联接运算符。使用Oracle联接运算符(+)
的外部联接查询受以下规则和限制的约束,这些规则和限制不适用于FROM
子句OUTER JOIN
语法:vc9ivgsu2#
在Oracle中,(+)表示JOIN中的“可选”表。因此,在查询中,
它是表'b'到表'a'的左外连接。当另一端(可选表'b')没有数据时,它将返回表'a'的所有数据,而不会丢失其数据。
相同查询的现代标准语法为
或使用
a.id=b.id
的简写(并非所有数据库都支持):如果删除(+),则为普通内部连接查询
Oracle和其它数据库中的旧语法:
更现代的语法:
或者简单地说:
它只返回'a'和'b'表'id'值相同的所有数据,表示公共部分。
如果要使查询成为右连接
这与LEFT JOIN相同,但是切换哪个表是可选的。
旧Oracle语法:
现代标准语法:
参考和帮助:
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
6tr1vspr3#
(+)运算符表示外部联接。这意味着Oracle仍将从联接的另一端返回记录,即使没有匹配项。例如,如果a和B是emp和dept,并且您可以将雇员取消分配到某个部门,则以下语句将返回所有雇员的详细信息,无论他们是否已分配到某个部门。
因此,简而言之,删除(+)可能会产生显著性差异,但您可能暂时不会注意到,这取决于您的数据!
mnemlml84#
实际上,+符号直接放在条件语句中,并放在可选表(允许在条件中包含空值或null值的表)的一侧。