作品:
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結合への移行はオプションですが、骨の折れるものです。このコードは多くの場所で変更する必要があり、多くの結合があります。この構文を正しくして、作業を進めたいと思います。
出来ますか?
運が悪かったのはさておき、古い skool 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>
コードの2番目のバージョンが機能しない可能性は十分にあります。それが以前に使用されていなかった場合、それが機能しないことはさらにもっともらしいです。(廃止された表記の使用方法については、受け入れられた回答を参照してください。以下のアドバイスの残りの部分は有効だと思いますが、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)
別のコメントは、「結合を3つのテーブルに拡張する方法」を尋ねています。
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
AND UPPER(a.name) = UPPER(b.lname (+))
動作します。私はそれをテストしました。正常に動作しています。