2 Stimmen

Oracle äußere Verbindung kurze Hand mit oberer

Werke:

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

funktioniert nicht

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

Die Umstellung auf ANSI-Verbindungen ist eine Möglichkeit, aber eine mühsame. Dieser Code sollte an vielen Stellen geändert werden, und es gibt viele Verknüpfungen. Ich möchte diese Syntax korrekt und auf meinem Weg sein.

Ist das möglich?

9voto

APC Punkte 140727

Abgesehen von der Unschönheit ist es ganz einfach, UPPER() mit der alten OUTER JOIN-Syntax zu verbinden: Wir müssen nur die Klammern in die richtige Reihenfolge bringen:

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> 

Hier erfahren Sie, wie Sie die neuere Syntax mit mehreren Tabellen einsetzen können:

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>

3voto

Jonathan Leffler Punkte 694013

Es ist durchaus möglich, dass die zweite Version des Codes nicht mehr funktioniert. Wenn er vorher nicht in Gebrauch war, ist es umso plausibler, dass er nicht funktioniert. (Siehe die akzeptierte Antwort für die Verwendung der veralteten Notation. Ich denke immer noch, dass der Rest der unten stehenden Ratschläge gültig ist - aber beachten Sie sorgfältig den Qualifizierer ' wenn Sie die SQL-Datei ändern müssen '; wenn Sie die SQL nicht aus einem anderen Grund ändern müssen, ist es nicht notwendig, die alte Schreibweise zu entfernen).

Beißen Sie in den sauren Apfel und arbeiten Sie mit der ANSI-Verknüpfung, wenn Sie einen Vergleich ohne Berücksichtigung der Groß-/Kleinschreibung durchführen müssen. Oder untersuchen Sie eine lokal basierte Alternative (mit case-insensitive-Vergleichen), falls eine solche Option in Oracle existiert.

Grundsätzlich sollten Sie jedoch die alte '(+)' Outer-Join-Notation in den Mülleimer werfen. Wenn Sie eine SQL-Anweisung ändern müssen, entfernen Sie die alte (veraltete) Notation und verwenden Sie stattdessen die ANSI-Join-Notation.


In einem Kommentar wird gefragt: "Wie kann dies in ANSI konvertiert werden"?

Sie schreiben sowohl die FROM-Klausel als auch die WHERE-Klausel um und verschieben dabei häufig die Join-Bedingungen von der WHERE-Klausel zu den ON-Bedingungen in der FROM-Klausel.

 SELECT a.*, b.*
   FROM a LEFT OUTER JOIN b ON UPPER(a.name) = UPPER(b.lname)

In einem anderen Kommentar wird die Frage gestellt, wie die Verknüpfung auf drei Tabellen erweitert werden kann.

 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

0voto

vijay Punkte 11
AND UPPER(a.name) = UPPER(b.lname (+))              

Funktioniert. Ich habe es getestet. Es funktioniert gut.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X