Merkwuerdige SQL-Syntax

Hallo Experten!

Beim Herumstoebern in einer Sammlung von SQL-Sequenzen bin ich auf folgendes
seltenes Expemplar einer kryptischen Anweisung gestossen:

select t1.\* from table1 t1, table2 t1 where t1.attribute1 = t2.attribute1(+);

Was mich an dieser Anweisung irritiert ist die Tatsache, dass man bei einem
Vergleich hinter einem Attribut ein Plus in Klammern schreiben kann,
doch aus keiner Literatur hervor geht, was man damit dem DBMS eigentlich
sagt.

Hat jemand dafuer eine plausible Erklaerung?

TIA
1stein

Das ist ein sogenannter outer join, d.h. Du bekommst für jeden Satz aus t1 einen Ergebnissatz, selbst wenn sich die referenz auf t2 nicht auflösen läßt. Oder anders gesagt: Wenn in t1 Sätze enthalten sind, deren Attribut in t2 nicht vorkommt, dann würden diese Sätze bei einem „normalen“ select nicht angezeigt, bei outer joins eben schon.

Vielleicht ist es mit einem Beispiel besser verständlich:
„lieferant“ soll Lieferanten beinhalten und „adresse“ deren Adresse, falls einen eingegeben wurde.

lieferant

soll das Format:

lieferantenid
name
adressid

haben und die zwei Sätze

(1,'N1', 1000)

und

(2,'N2',1001)

beinhalten.

adresse

ist definiert als:

adressid
ort

und enthält nur einen Satz, nämlich

(1000,'Berlin')

ein select ohne outer join:

select \* from lieferant l, adresse a 
where l.adressid=a.adressid;

Ergebnis:
1,N1,1000,1000,Berlin

ein select mit outer join:

select \* from lieferant l, adresse a 
where l.adressid=a.adressid(+);

Ergebnis:
1,N1,1000,1000,Berlin
2,N2,1001,null,null

Alles klar? Solltest Du noch Fragen haben, kannst Du mich gerna auch per e-mail kontaktieren.

GruĂź,
Martin

P.S.: Daß die Daten im Beispiel unsinnig siond ist mir schon klar, aber mir ist auf die Schnelle nix besseres eingefallen…

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo!

Danke fuer die kompetente Antwort! Der Tip mit dem Outer-Join
hat mir echt weitergeholfen. Warum ich nicht von selbst
darauf gekommen bin, liegt daran, dass diese Syntax
nicht genormt, also propritaer ist.

In meiner Literatur wird zum Thema Outer-Equi-Join auch
darauf hingewiesen und (da in dem Buch nur ANSI-SQL
beschrieben wird) auch keine Syntax dafuer genannt.

BTW: Gibt es im Internet eigentlich eine gute
Oracle-SQL-Befehlsreferenz?

Das ist ein sogenannter outer join, d.h. Du bekommst fĂĽr jeden
Satz aus t1 einen Ergebnissatz, selbst wenn sich die referenz
auf t2 nicht auflösen läßt. Oder anders gesagt: Wenn in t1
Sätze enthalten sind, deren Attribut in t2 nicht vorkommt,
dann würden diese Sätze bei einem „normalen“ select nicht
angezeigt, bei outer joins eben schon.

[SNIP]

Ergebnis:
1,N1,1000,1000,Berlin
2,N2,1001,null,null

Alles klar? Solltest Du noch Fragen haben, kannst Du mich
gerna auch per e-mail kontaktieren.

GruĂź,
Martin

P.S.: DaĂź die Daten im Beispiel unsinnig siond ist mir schon
klar, aber mir ist auf die Schnelle nix besseres
eingefallen…

Es untermalt aber sehr gut den Sachverhalt. Zumindest habe ich
verstanden, was Du meinst, also kann es nicht schlecht gewesen
sein :smile:

Viele Gruesse,
1stein

Hallo!

Danke fuer die kompetente Antwort! Der Tip mit dem Outer-Join
hat mir echt weitergeholfen. Warum ich nicht von selbst
darauf gekommen bin, liegt daran, dass diese Syntax
nicht genormt, also propritaer ist.

BTW: Gibt es im Internet eigentlich eine gute
Oracle-SQL-Befehlsreferenz?

Am Besten Du meldest Dich (gratis) im Oracle TechNet an (http://technet.oracle.com). Dort findest Du ziemlich vieles, unter anderem eine komplette Referenz zu Oracle SQL.

GruĂź,
Martin

1 Like

Hi!

Vielleicht bin ich etwas blind, aber wo find ich denn die SQL-Referenz?!?!?!?

Dankää

Bernd

Schau mal unter http://technet.oracle.com/docs/products/oracle8/doc_… , dort dann unter „Oracle 8 Server, Release 8.0.4, 8.0.5, 8.0.6“
weiter lesen. Da findet sich so ziemlich alles, was man ĂĽber Oracle wissen will.

GruĂź
Martin

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]