2017-07-17 156 views
0

我有以下查询。与+运营商联系

Select a.c1,b.c1,a.c2,b.c2 from tab1 a,tab2 b 
where a.c3(+)=b.c3 and b.c3(+) = 'abc' 

我知道上面的查询是将tab1与tab2左连接。但我不明白b.c3(+)是什么意思。请帮我解决这个问题。提前致谢。

+3

[Oracle“(+)”Operator]的可能重复(https://stackoverflow.com/questions/4020786/oracle-operator) –

+0

https://stackoverflow.com/questions/4020786/oracle-operator – mohan111

+0

@ AndréStannek - 这个问题**不是您建议的**的重复**。这里的问题是:“(+)是什么意思**在平等的另一端,我们有一个常数值**” – mathguy

回答

3

你不需要了解发生了什么。该语法已过时,应该被弃用(SQL Server中不建议使用类似的语法)。

刚刚学写这为外连接:

Select a.c1, b.c1, a.c2, b.c2 
from tab1 a left join 
    tab2 b 
    on a.c3 = b.c3 and b.c3 = 'abc'; 
+1

我很想知道你的想法是什么,对于实际上还在教授30多岁的语法的教授/讲师,这些语法在今天很少使用。 –

+0

我正在分析一个旧代码。在那里我得到了这条线a.b(+)='abc'。这是a.b(+)有一些意思,还是这意味着a.b ='abc' – mano

+0

这意味着它之前的表达式应该被视为外连接的弱侧;即在你的例子中,如果表'A'中没有与'b.c3'匹配的行,那么'B'行不会被排除在结果之外,并且将被视为它已经连接到来自'A'的行与所有空值。 –

0

有趣的问题!您不需要多个表格来提问或实验。

取出SCOTT模式中的EMP表。

select * from emp where deptno = 10 

将返回三人行,对于员工在部门10

,我们能得到什么,如果我们将其更改为

select * from emp where deptno(+) = 10 

?一种可能是我们收到错误信息。另一个就是 - 与外部连接的Oracle表示法类似 - 即使deptno不等于10,我们也会获得EMP行的行。(但是,实际上,这是错误的期望;当deptno不是10时得到行, (+)应该在右侧 - 并且将导致错误。)

事实上,我们都没有得到这些。相反,(+)忽略。我们得到和以前完全一样的三排。

所以你的猜测是正确的:(+)在这种情况下什么都不做。

只是要非常清楚:“上下文”是我们有一个条件=和一侧(+)语法,但另一侧是一个常量表达式 - 条件是而不是实际“加入条件”。