2009-10-23 162 views
1

爲什麼不能在Oracle中使用?有沒有辦法在oracle中執行多個左外連接?

有沒有辦法讓這項工作?

FROM table1 a, 
    table2 b, 
    table3 c 
WHERE a.some_id = '10' 
AND a.other_id (+)= b.other_id 
AND a.other_id (+)= c.other_id 

我想table1被左外加入了對多表...

如果我試圖改變它使用一個ANSI加入,我得到的編譯錯誤。我做了以下操作:

FROM table2 b, table3 c 
LEFT JOIN table1 a ON a.other_id = b.other_id and a.other_id = c.other_id 

回答

7

好的,從Oracle文檔中查看examples,我對語法的回憶是正確的,所以我將我的意見轉化爲答案。假設你的目標是一個左外連接,其中A是基表,並且你加入了來自B和C的匹配行,按如下方式重寫你的查詢(注意,我只是改變了前綴;我喜歡讓源行集在正確的)。

FROM table1 a, 
    table2 b, 
    table3 c 
WHERE a.some_id = '10' 
AND b.other_id (+)= a.other_id 
AND c.other_id (+)= a.other_id 

如果這不是你想要做什麼,然後將查詢borked:你正在做一個笛卡兒連接B和C,然後嘗試外從部分結果爲連接,以對A的一個附加謂詞,這沒有多大意義。

+0

我想澄清。我的印象是,如果(+)在某列的右側,那麼LEFT JOIN就在那張桌子上......我錯了嗎? 是的我想table1 a是基表 – Omnipresent

+0

你錯了 - 看看我提供的 – kdgregory

+0

這樣的例子鏈接。左連接正在完成一個??這意味着我們將獲得 – Omnipresent

5

使用ansi連接。他們更清晰的國際海事組織。 BUT由於某些原因,它們不能與物化視圖一起工作...

+0

+1 - 它更清晰,但是Oracle直到(我相信)10g才支持它,所以有很多舊語法的遺留代碼。使用一致的語法可能會更好。 – kdgregory

+0

@kdgregory:不,我在9i中使用了ANSI JOIN。 –

0

在oracle中,不能將同一個表中的外部表連接到多個其他表中。您可以創建視圖並加入其中,然後加入該視圖。注意,你也不能外連接到一個子選擇,所以這裏也不是一個選項。

2

你可以做這樣的事情。

FROM table1 a,  table2 b,  table3 c 
WHERE a.some_id = '10' 
AND a.other_id = b.other_id(+) 
AND a.other_id = c.other_id(+) 
+0

再次,我認爲把(+)放在右邊會使table2和table3成爲基表。在那裏我想table1一個基地 – Omnipresent

+0

沒有。 table1基於上面的查詢。 –

+0

同意。由於原始查詢在table1中的some_id上​​具有相等條件,因此將table1外連接到其他表並不合理,這是原始查詢的作用。大概你想要的是將其他兩個表外連接到table1,這是Henry的查詢所要做的。 –

2

我想單獨解決您的問題,這部分:

If I try to change it to ANSI join I get compilation errors. I did the following: 

FROM table2 b, table3 c 
LEFT JOIN table1 a ON a.other_id = b.other_id and a.other_id = c.other_id 

在ANSI連接,至少在甲骨文中,你需要整整兩個行源工作。在你的例子中,LEFT JOIN運算符的table3和table1作爲其操作數;所以你不能在ON子句中引用「b.otherid」。每個附加表需要一個新的連接運算符。

我相信你正在嘗試做的是外連接表2和表3至表1.所以,你應該做的是:

FROM table1 a LEFT JOIN table2 b ON b.other_id = a.other_id 
       LEFT JOIN table3 c ON c.other_id = a.other_id 

或亨利高的查詢,如果您要使用Oracle特定的語法。

0

你可以關閉過程嘗試以下(表b和c是所述BASE) FROM(SELECT other_id FROM table2中 UNION SELECT other_id FROM表3)b LEFT JOIN TABLE1一個b.other_id = a.other_id

但是我又是一個Oracle諾諾

相關問題