我想知道是否總是可以使用舊的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')
沒有成功。它有可能嗎?
謝謝。
我想知道是否總是可以使用舊的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')
沒有成功。它有可能嗎?
謝謝。
我你不使用的(+)運算b.other_field的測試猜測.. 這應該工作:
SELECT *
FROM table_1 a, table_2 b
WHERE b.table1_id(+) = a.id
AND b.other_field(+) = 'value1'
如果我沒有記錯,它不是總是可能重寫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_id
和table_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子句的其餘部分。
我認爲你已經完全錯過了這個問題。提供的SQL沒有什麼錯 - OP想用Oracle(+)語法改寫它。 – StevieG
我包含了Oracle語法。 –
在我們的Oracle實例中,我們發現,使用oracle( +)語法運行相同的查詢要慢得多,例如幾小時而不是幾分鐘。使用標準連接語法表現最佳。 –