2010-10-26 95 views
117

我正在檢查一些舊的SQL語句,以便記錄它們並可能增強它們。Oracle「(+)」運算符

的DBMS是Oracle

我不明白上面寫着這樣的語句:

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

我感到困惑的(+)運營商,並且在任何論壇上無法得到它... ...(在引號內搜索+也不起作用)。

反正我用「解釋計劃」的SQLDeveloper的,我得到的輸出說HASH JOIN, RIGHT OUTER

會不會有任何區別,如果我刪除(+)運營商在查詢的結束?在使用(+)之前,數據庫是否必須滿足某些條件(如有一些索引等)?如果你能給我一個簡單的理解,或者我可以閱讀關於它的一些很好的鏈接,這將是非常有幫助的。

謝謝!

回答

147

這是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 recommends not using it

Oracle建議您使用FROM條款OUTER JOIN語法,而不是甲骨文加入經營者。外連接是使用Oracle聯接運算符(+)受到以下規則和限制,並不適用於FROM條款OUTER JOIN語法查詢:

+0

哦謝謝! - 根本沒有期待! – Sekhar 2010-10-26 04:56:22

+60

沒錯。爲了保持(+)直線在我的腦海中(左側和右側),我喜歡將(+)看作「如果找不到匹配就添加NULL值」。例如,「a.id = b.id(+)」表示如果與a.id不匹配,則允許b.id爲NULL。 – beach 2010-10-26 05:00:05

+0

謝謝..我猜想從from子句中添加它應該會得到相同的結果! – 2013-02-19 08:03:05

24

的(+)運算符表示外連接。這意味着即使沒有匹配,Oracle仍然會從聯接的另一端返回記錄。例如,如果a和b是emp和dept,並且您可以讓員工未分配給某個部門,那麼以下語句將返回所有員工的詳細信息,而不管他們是否已分配到某個部門。

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

因此,在短期,去除(+),可以使一個顯着性差異,但是這取決於你的數據,你可能不會注意到了一段時間!

5

實際上,+符號直接放置在條件語句和可選表(允許在條件中包含空值或空值的那一邊)的一側。

8

在Oracle中,(+)表示JOIN中的「可選」表。所以在你的查詢中,

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

它是一個左'外'加'表'與'一'表。就像現代的左連接查詢一樣。 (它會回報不失去對對方可選表「B」可以失去了數據的數據「一」表的所有數據) enter image description here

select a.id, b.id, a.col_2, b.col_2, ... 
from a 
Left join b ON a.id=b.id 

OR

select a.id, b.id, a.col_2, b.col_2, ... 
from a 
Left join b using(id) 
現在

如果刪除(+),那麼它會是正常的內部聯接查詢,

select a.id, b.id, a.col_2, b.col_2, ... 
from a,b 
where a.id=b.id 

enter image description here

它只會返回'a'&'b'表'id'值相同的所有數據,表示公用部分。

外:如果你想使你的查詢作爲權舊格式或現代再加入它會出現像波紋管:

enter image description here

老:

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 using(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