2010-07-13 81 views
1

作品:甲骨文外連接短手與上

AND UPPER(a.name) = b.lname(+) 

不起作用

AND UPPER(a.name) = UPPER(b.lname) (+) 

移動到ANSI連接是一種選擇,而是一種艱苦的一個。這段代碼應該在很多地方進行更改,並且有很多連接。我想得到這個語法正確,並在我的路上。

可能嗎?

+0

Yuck - 移動到ANSI連接格式 - 更好,更少的錯誤範圍! – 2010-07-13 00:06:06

+0

這怎麼能轉換成ANSI? – 2010-07-13 00:09:15

+0

兩者都是ANSI - 這是89語法; 92有外部連接支持 - 這是關於這個問題的,因爲這個問題是關於Oracle的老式外部連接語法的... – 2010-07-13 00:11:21

回答

6

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

+1:有趣的是,我希望我永遠不必記住這個訣竅:) – 2010-07-13 01:04:47

+0

確實添加UPPER意味着該索引不會被使用?我知道索引是不會使用,如果我們添加修剪 – 2010-07-13 01:30:15

+0

@learn_plsql - 這是一個單獨的問題;)簡短的回答是你是正確的,但有解決方法。 – APC 2010-07-13 01:49:39

3

第二版本的代碼很可能無法工作。如果以前沒有使用它,那麼它將無法工作更加合理。(請參閱已接受的答案,瞭解如何使用過時的符號,我仍然認爲下面的建議的其餘部分 - 但請注意修改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 
+0

+1:我的觀點正確。 – 2010-07-13 00:13:50

+0

如果需要與另一個表進行外部連接,例如c。那我們做嗎? '從左側外部連接b上部(a.name)=上部(b.name),左側外部連接c on a.first = c.first' – 2010-07-13 00:22:07

+0

「很可能第二個版本的代碼將會不工作,永遠。「 - 實際上它確實有效,正確放置括號。 – APC 2010-07-13 01:11:15

0
AND UPPER(a.name) = UPPER(b.lname (+))               

作品。我測試了它。它工作正常。

+0

請考慮在答案中添加更多信息。 – Esteban 2013-06-06 22:23:04