2

作品:

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

動作しません

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

ANSI結合への移行はオプションですが、骨の折れるものです。このコードは多くの場所で変更する必要があり、多くの結合があります。この構文を正しくして、作業を進めたいと思います。

出来ますか?

4

3 に答える 3

9

運が悪かったのはさておき、古い 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>
于 2010-07-13T00:58:13.530 に答える
3

コードの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
于 2010-07-13T00:09:44.343 に答える
0
AND UPPER(a.name) = UPPER(b.lname (+))              

動作します。私はそれをテストしました。正常に動作しています。

于 2013-06-06T21:56:14.980 に答える