作品:甲骨文外連接短手與上
AND UPPER(a.name) = b.lname(+)
不起作用
AND UPPER(a.name) = UPPER(b.lname) (+)
移動到ANSI連接是一種選擇,而是一種艱苦的一個。這段代碼應該在很多地方進行更改,並且有很多連接。我想得到這個語法正確,並在我的路上。
可能嗎?
作品:甲骨文外連接短手與上
AND UPPER(a.name) = b.lname(+)
不起作用
AND UPPER(a.name) = UPPER(b.lname) (+)
移動到ANSI連接是一種選擇,而是一種艱苦的一個。這段代碼應該在很多地方進行更改,並且有很多連接。我想得到這個語法正確,並在我的路上。
可能嗎?
Yuckiness一邊,與老斯庫爾OUTER JOIN語法包含UPPER()本身很簡單:我們只需要得到括號中正確的順序:
SQL> select t23.name
2 , d.university
3 from t23
4 , t_doctors d
5 where upper(t23.name) = upper(d.name(+))
6 order by t23.id
7/
NAME UNIVERSITY
------------ --------------------
SAM-I-AM
MR KNOX
FOX IN SOCKS
CAT
LORAX
BILLY
MAISIE
DR SINATRA Whoville U
DR FONZ U of Grin-itch
PINNER BLINN
10 rows selected.
SQL>
下面是如何部署具有多個表的較新的語法:
SQL> select t23.name
2 , d.university
3 , k.school
4 from t23
5 left outer join t_doctors d
6 on upper(t23.name) = upper(d.name)
7 left outer join t_kids k
8 on upper(t23.name) = upper(k.name)
9 order by t23.id
10/
NAME UNIVERSITY SCHOOL
------------ -------------------- --------------------
SAM-I-AM Mulberry St Junior
MR KNOX
FOX IN SOCKS
CAT
LORAX
BILLY Roover River High
MAISIE Roover River High
DR SINATRA Whoville U
DR FONZ U of Grin-itch
PINNER BLINN
10 rows selected.
SQL>
+1:有趣的是,我希望我永遠不必記住這個訣竅:) – 2010-07-13 01:04:47
確實添加UPPER意味着該索引不會被使用?我知道索引是不會使用,如果我們添加修剪 – 2010-07-13 01:30:15
@learn_plsql - 這是一個單獨的問題;)簡短的回答是你是正確的,但有解決方法。 – APC 2010-07-13 01:49:39
第二版本的代碼很可能無法工作。如果以前沒有使用它,那麼它將無法工作更加合理。(請參閱已接受的答案,瞭解如何使用過時的符號,我仍然認爲下面的建議的其餘部分 - 但請注意修改SQL時限定符'';如果您不需要更改SQL出於某種其他原因,沒有必要刪除舊式表示法。)
當需要執行不區分大小寫的比較時,咬住子彈並處理ANSI連接。或者調查一個基於語言環境的替代方案(不區分大小寫的比較),如果Oracle中存在這樣的選項。
但是,從根本上說,您應該將舊的'(+)'外部連接符號委託給垃圾桶。當您必須修改SQL語句時,請刪除舊的(過時的)記法並改爲使用ANSI聯合記號。
評論詢問'如何將其轉換爲ANSI'?
您重寫FROM子句以及WHERE子句 - 通常將連接條件從WHERE子句移動到FROM子句中的ON條件。
SELECT a.*, b.*
FROM a LEFT OUTER JOIN b ON UPPER(a.name) = UPPER(b.lname)
另一評論問「如何擴展加盟三個表」?
SELECT a.*, b.*
FROM a
LEFT OUTER JOIN b ON UPPER(a.name) = UPPER(b.lname)
LEFT OUTER JOIN c ON on a.first = c.first
+1:我的觀點正確。 – 2010-07-13 00:13:50
如果需要與另一個表進行外部連接,例如c。那我們做嗎? '從左側外部連接b上部(a.name)=上部(b.name),左側外部連接c on a.first = c.first' – 2010-07-13 00:22:07
「很可能第二個版本的代碼將會不工作,永遠。「 - 實際上它確實有效,正確放置括號。 – APC 2010-07-13 01:11:15
AND UPPER(a.name) = UPPER(b.lname (+))
作品。我測試了它。它工作正常。
請考慮在答案中添加更多信息。 – Esteban 2013-06-06 22:23:04
Yuck - 移動到ANSI連接格式 - 更好,更少的錯誤範圍! – 2010-07-13 00:06:06
這怎麼能轉換成ANSI? – 2010-07-13 00:09:15
兩者都是ANSI - 這是89語法; 92有外部連接支持 - 這是關於這個問題的,因爲這個問題是關於Oracle的老式外部連接語法的... – 2010-07-13 00:11:21