2011-10-26 51 views
3

我想知道是否總是可以使用舊的Oracle語法(+)重寫LEFT JOIN。特別是,我試圖用(+)外連接(+)的舊Oracle語法是否等於新語法?

SELECT * 
FROM table_1 a 
LEFT JOIN table_2 b ON (b.table1_id = a.id AND b.other_field = 'value1') 

沒有成功。它有可能嗎?
謝謝。

+1

在我們的Oracle實例中,我們發現,使用oracle( +)語法運行相同的查詢要慢得多,例如幾小時而不是幾分鐘。使用標準連接語法表現最佳。 –

回答

7

我你不使用的(+)運算b.other_field的測試猜測.. 這應該工作:

SELECT * 
FROM table_1 a, table_2 b 
WHERE b.table1_id(+) = a.id 
AND b.other_field(+) = 'value1' 
+0

謝謝,你說得對。我沒有正確使用它(實際上,在我必須處理遺留代碼之前,我從未使用過舊的語法)。感謝您的回答 – a1ex07

+2

沒問題。如果您之前沒有使用舊的風格,您可能會發現[this](http://download.oracle.com/docs/cd/B14117_01/server.101/b10759/queries006.htm)... – StevieG

3

如果我沒有記錯,它不是總是可能重寫Oracle舊的外部連接語法中的ANSI連接,因爲執行順序可以更改返回的行。

「沒有成功」是什麼意思?你有錯誤嗎?你弄錯了行嗎?你是否弄錯了專欄?

左連接將保留table_1中的所有行。舊式Oracle語法的基本形式是帶有WHERE子句的笛卡爾積,另一個表上帶有「+」標記。 (這不包括你的整個WHERE子句。這是經過深思熟慮的。)

SELECT * 
FROM table_1 a, table_2 b 
WHERE a.id = b.table1_id(+) 

見,例如,AskTom

用於故障排除。 。 。

如果你開始你的查詢

SELECT * 
FROM table_1 a 
LEFT JOIN table_2 b ON (b.table1_id = a.id AND b.other_field = 'value1') 

和淘汰的別名,你必須

SELECT * 
FROM table_1 
LEFT JOIN table_2 ON (table_2.table1_id = table_1.id AND 
         table_2.other_field = 'value1') 

是否有實際命名table_2.table1_idtable_1.id列?那樣有用嗎?

如果這不是問題開始更簡單。嘗試這個。

SELECT table_1.id, table_2.table1_id 
FROM table_1 
INNER JOIN table_2 ON (table_2.table1_id = table_1.id); 

這是否行得通?接下來嘗試一下。

SELECT table_1.id, table_2.table1_id 
FROM table_1 
LEFT JOIN table_2 ON (table_2.table1_id = table_1.id); 

如果可行,請嘗試添加JOIN子句的其餘部分。

+2

我認爲你已經完全錯過了這個問題。提供的SQL沒有什麼錯 - OP想用Oracle(+)語法改寫它。 – StevieG

+0

我包含了Oracle語法。 –