Oracle SQL WHERE子句中的(+)符号是什么意思?

104

可能重复:
Oracle:在WHERE子句中,(+)的作用是什么?

考虑下面简化的SQL查询,在Oracle数据库环境中(尽管我不确定它是否特定于Oracle):

SELECT 
   t0.foo, t1.bar
FROM
   FIRST_TABLE t0, SECOND_TABLE t1
WHERE
   t0.ID (+) = t1.ID;

(+)符号在WHERE子句中是什么意思?非常抱歉这可能是一个愚蠢的新手问题,但在Google或StackOverflow上搜索起来非常困难...因为即使使用引号,搜索引擎也会将加号视为某种逻辑指令。


1
并且:Oracle“(+)”运算符 - OMG Ponies
2
好的。我会投票删除...虽然现在已经关闭了,显然我必须等待2天才能这样做(Stack Overflow的某些程序对我来说毫无意义)。 - Steve Perkins
3
噢。Stack Overflow告诉我必须等待两天才能投票删除,原因很荒谬并且难以理解。我耐心等待后,它又告诉我由于回答或赞数过多,我不能删除。但是,在过去的两天里,回答和赞数都没有改变...所以一开始就应该告诉我!不管怎样,我们有一个重复的问题...我想只能忍受它了。难怪这个网站会为基本使用颁发各种“奖章”。用户应该得到它们! - Steve Perkins
1
我在寻找Oracle SQL查询中这些(+)的含义,但是无法通过Google搜索到它们。于是我前往Stack Overflow,但是Stack Overflow的搜索引擎却没有给我任何关于(+)的结果,这是错误的。实际上,Stack Overflow上至少有两个关于(+)含义的问题。希望能够修正搜索引擎。 - Nicolas Barbulesco
截至2022年2月,谷歌将此页面列为“SQL中的“(+)”是什么”的第二个搜索结果,而第一位则是Oracle外连接运算符(+)的特色片段,它允许您在两个或多个表之间执行外连接。@NicolasBarbulesco - Pere
1个回答

86
这是一种Oracle特有的外连接符号表示法。它意味着将包括t1中的所有行,并在t0列中使用NULLS,如果在t0中没有相应的行。
在标准SQL中,应编写如下内容:
SELECT t0.foo, t1.bar
  FROM FIRST_TABLE t0
 RIGHT OUTER JOIN SECOND_TABLE t1;

Oracle 建议如果您的版本支持ANSI联接(LEFT/RIGHT JOIN),不再使用这些联接

Oracle 建议您使用FROM子句的OUTER JOIN语法,而不是使用Oracle联接运算符。使用Oracle联接运算符(+)的外连接查询受以下规则和限制的影响[...]。


3
最近的Oracle版本(我想从10g开始)支持SQL-92语法,允许明确指定外部连接(而不是使用传统的(+)运算符)。值得一提的是。 - user359040
2
@Mark Bannister:8i 有一些,但在9i中很容易获取。 - OMG Ponies
2
最后,这真是一件让人头疼的谷歌搜索。 - Pieter De Bie
抱歉晚了查询。当加号出现在条件的右侧或条件的左侧时,这意味着什么? - khalidmehmoodawan
1
有趣的是这个问题已经被接受了这么长时间。根据Oracle文档中提供的答案,"要编写一个查询,执行表A和B的外连接并返回所有来自A的行(左外连接),请在FROM子句中使用LEFT [OUTER] JOIN语法,或者在WHERE子句中将外连接运算符(+)应用于B的所有列的连接条件中。对于A中所有没有匹配行的行,Oracle数据库会为包含B列的任何选择列表表达式返回null。" 看起来Benoit颠倒了他在回答中描述的连接。 - zielot
1
@zielot 我认为这里的“RIGHT OUTER JOIN”是正确的,因为在原始问题中,(+)包含在左侧。https://dev59.com/3W865IYBdhLWcg3wCp9A#4020794 更好地解释了它。 - lmsurprenant

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接