Inner Join vs. Outer Join

Hallo,

ein inner Join kann in SQL explizit angegeben werden, muss aber nicht.

Bsp.: SELECT a1.r2, a2, a1.r1
FROM r1, r2
WHERE a1.r1 = a1.r2

ist gleich

SELECT a1.r2, a2, a1.r1
FROM r1 JOIN r2
ON a1.r1 = a1.r2

Wenn nicht bitte ich um Korrektur.

Beim OUTER JOIN verstehe ich das Beispiel aus KE 2 Datenbanken 1, Seite 33 nicht. Das RIGHT OUTER JOIN gibt aus Relation 2 das erste Attribut mit an, obwohl die on Bedingung nicht erfüllt wird.

Konkret:
SELECT *
FROM EINS RIGHT OUTER JOIN ZWEI
ON EINS.B = ZWEI.B

EINS.A = a3; EINS.B = NULL; ZWEI.B = b3; ZWEI.C = NULL

In meiner Lösung würde in der Zielrelation folgende Werte stehen
NULL; NULL; NULL; NULL
im Skript steht aber
NULL; NULL; b3; NULL
das verstehe ich nicht, da die Bedingung ZWEI.B mit impliziert und lediglich rechts des Vergleiches betrachten soll.

Vielen Dank für eure Hilfe.


Gruß

Mundus
 
Durch die Joins werden zwei (oder mehr) Relationen zu einer gemacht. Die Spaltenüberschriften werden dabei einfach nebeneinandergeschrieben (und beim NAT JOIN werden gleiche Überschriften verschmolzen).
Relation EINS:
a b
a1 b1
a2 b2
a3 NULL


Relation ZWEI:
b c
b1 c1
b2 c2
b3 NULL[/COLOR]

Der Sinn der Outer Joins besteht darin, die Werte der angegebenen Relation auf jeden Fall auszugeben, auch wenn es dazu keine passenden Werte der anderen Relation gibt. Ein
SELECT * FROM EINS LEFT OUTER JOIN ZWEI ON EINS.B = ZWEI.B
gibt demnach alle Zeilen der Relation EINS aus, auch wenn die Bedingung "ON EINS.B = ZWEI.B" nicht erfüllt ist. Die Überschriften der Relation ZWEI können aber nicht einfach ignoriert werden und so entstehen die NULL-Werte in der dritten Zeile:
a b b c
a1 b1 b1 c1[/COLOR]
a2 b2 b2 c2[/COLOR]
a3 NL NL NL[/COLOR]

In der dritten Zeile gibt es aus der Relation ZWEI kein passendes Gegenstück. EINS.b = NULL findet sich in ZWEI nicht wieder (generell kann man nicht NULL mit NULL vergleichen). Da wir aber einen LEFT OUTER JOIN haben und die Relation EINS auf der linken Seite der Abfrage steht, wird diese Zeile mit in die resultierende Relation übernommen und die rechte Seite (Relaiton ZWEI) wird mit Null gefüllt. Beim RIGHT OUTER JOIN (ROJ) verhält es sich genauso: Für die dritte Zeile aus Relation ZWEI (b3, NULL) gibt es kein passendes Wertepaar aus Relation EINS, da in EINS kein b=b3 vorkommt. Da wir aber einen ROJ verwenden, werden alle Zeilen der Relation ZWEI aufgelistet und die Spalten aus der Relation EINS werden mit NULL gefüllt.

Übrigens:
[...] FROM EINS LEFT OUTER JOIN ZWEI [...] ist das gleiche wie
[...] FROM ZWEI RIGHT OUTER JOIN EINS [...]

Im ersten Beispiel werden alle Zeilen der Relation, die links vom Join steht, auf jeden Fall angegeben. Im zweiten Fall werden alle Zeilen der Relation, die rechts vom Join steht, auf jeden Fall angegeben. Beim FULL OUTER JOIN (FOJ) werden alle Zeilen beider Relationen auf jeden Fall angegeben, auch wenn es beim Vergleich der ON-Bedingung keine Übereinstimmungen gibt. Siehe Bsp. in KE2. Die letzten beiden Zeilen der FOJ entsprechen genau den jeweils letzten Zeilen aus LOJ und ROJ in den zwei vorherigen Tabellen.

Auch wenn das jetzt viel Text ist hoffe ich natürlich, dass es weiterhilft ;)


Gruß,

Marcel
 
Die einfachste und Beschreibung eines LEFT OUTER JOIN habe ich bisher in MS Access 2003 gefunden:
"Beinhaltet ALLE Datensätze aus 'TABELLE A' und nur die Datensätze aus 'TABELLE B', bei denen die Inhalte der verknüpften Felder beider Tabellen gleich sind."
 
Danke.

Mir ist jetzt erst deutlich geworden, dass die entsprechende Zeile der linken bzw. rechten Relation in Gänze erhalten bleibt.

Das Problem habe ich dank deiner Erklärung nun gelöst. In dem Beispiel bin ich natürlich auf das NULL 2 Problem reigefallen. Beim LOJ ist in der Zielrelation

a3, NULL, NULL, NULL

was bei mir die Fehlinterpretation verursacht hat, dass nur a3 als Attribut betrachtet wird.

Also nochmal vielen Dank.

Gruß

Mundus
 
Top