2017-07-17 73 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時得到行, (+)應該在右側 - 並且將導致錯誤。)

事實上,我們都沒有得到這些。相反,(+)忽略。我們得到和以前完全一樣的三排。

所以你的猜測是正確的:(+)在這種情況下什麼都不做。

只是要非常清楚:「上下文」是我們有一個條件=和一側(+)語法,但另一側是一個常量表達式 - 條件是而不是實際「加入條件」。