OSZ Handel I
Informatik
Relationale Datenbanken
Grundoperationen auf Tabellen (Relationen)

Hartmut Härtl

[Startseite OSZ | Startseite Gymnasiale Oberstufe | Informatik | Unterrichtsmaterialien]
[ Datenbanken]
[Textende]


JOIN (VERBUND) (Zusammenziehen der Informationen aus verschiedenen Tabellen)

Solange keine der verbundenen Tabellen NULL-Werte enthält sind Verbunde relativ unkompliziert zu handhaben. (Zur Problematik "Verbundspalten mit NULL-Werten" beachte die nachfolgende Seite.)

Der einfachste Verbund ist ein sog. "CROSS JOIN" bei dem das Ergebnis aus dem Kreuzprodukt der beteiligten Tabellen besteht. Z.B.:

SELECT *
FROM Artikel, Lieferanten

SELECT *
FROM Artikel CROSS JOIN Lieferanten

Das Ergebnis einer solchen Abfrage ist aber in aller Regel nicht besonders erleuchtend, so dass es in aller Regel erforderlich ist, das Ergebnis einer Verbundoperation auf eine bestimmte Teilmenge einzugrenzen.

Dies geschieht z.B. in der nachfolgenden Aufgabe, bei dem auf zwei verschiedenen Lösungswegen ein sog. "natürlichen Verbund" erzeugt wird.

Aufgabe:
Erstellen Sie eine Artikelliste mit ArtNr, Artikelbezeichnung und Name und Ort des jeweiligen Lieferanten
 

Artikel

ArtNr Bezeichnung Bestand Preis StammLief
100 Bohrer 100 4,85 4711
101 Pinsel 210 7,60 3299
103 Hammer   17 8,30 4711
105 Zange   25 24,50 4711
110 Kelle     9 16,80 3000
111 Gips 200 9,60 2000
112 Zement 180 10,40 2000
 
Lieferanten
LiefNr Name Ort ...
2000 Lederer AG Berlin
2300 Teufel & Co Potsdam
3000 Auf & Ab KG Bernau
3299 Trims OHG Berlin
4700 Bert & Kage Berlin
4711 Kugler GmbH Kremmen
4800 Aal & Söhne Potsdam

schraegpfeil.jpg (2453 Byte)

schraegpfeillinks.jpg (1796 Byte)

SELECT ArtNr, Bezeichnung, Name, Ort
FROM Artikel, Lieferanten
WHERE Artikel.StammLief = Lieferanten.LiefNr

SELECT ArtNr, Bezeichnung, Name, Ort
FROM Artikel INNER JOIN Lieferanten
  ON Artikel.StammLief = Lieferanten.LiefNr

untenpfeil.jpg (2379 Byte)

ArtNr Bezeichnung Name Ort
100 Bohrer Kugler GmbH Kremmen
101 Pinsel Trims OHG Berlin
103 Hammer Kugler GmbH Kremmen
105 Zange Kugler GmbH Kremmen
110 Kelle Auf & Ab KG Bernau
111 Gips Lederer AG Berlin
112 Zement Lederer AG Berlin

JOINS unter Tabellen, die NULL-Werte enthalten

Sobald aber eine der beteiligten Tabellen NULL-Werte enthält, wird die Sache etwas interessanter.

Nun erhält man je nachdem, ob man sich für einen INNER JOIN, LEFT OUTER JOIN, RIGHT OUTER JOIN, oder FULL OUTER JOIN entscheidet ein jeweils anderes Ergebnis. Ändert man das zugrunde liegende Beispiel derart, dass in der Tabelle Artikel die Spalte Stammlief NULL-Werte enthält, würden beide Varianten der Verbundabfrage auf der letzten Seite ein irreführendes Ergebnis liefern.

Artikel

ArtNr Bezeichnung Bestand Preis StammLief
100 Bohrer 100 4,85 4711
101 Pinsel 210 7,60 3299
103 Hammer 17 8,30 4711
105 Zange 25 24,50 4711
110 Kelle 9 16,80 3000
111 Gips 200 9,60 NULL
112 Zement 180 10,40 NULL

Lieferanten

LiefNr Name Ort ...
2000 Lederer AG Berlin
2300 Teufel & Co Potsdam
3000 Auf & Ab KG Bernau
3299 Trims OHG Berlin
4700 Bert & Kage Berlin
4711 Kugler GmbH Kremmen
4800 Aal & Söhne Potsdam

 

SELECT ArtNr, Bezeichnung, Name, Ort
FROM Artikel, Lieferanten
WHERE Artikel.StammLief = Lieferanten.LiefNr
SELECT ArtNr, Bezeichnung, Name, Ort
FROM Artikel INNER JOIN Lieferanten
ON Artikel.StammLief = Lieferanten.LiefNr

untenpfeil.jpg (2379 Byte)

ArtNr Bezeichnung Name Ort
100 Bohrer Kugler GmbH Kremmen
101 Pinsel Trims OHG Berlin
103 Hammer Kugler GmbH Kremmen
105 Zange Kugler GmbH Kremmen
110 Kelle Auf & Ab KG Bernau
zementproblem.jpg (6930 Byte)

Aus dieser Ergebnisliste ist nicht zu entnehmen, dass für die Artikel "Gips" und "Zement" kein Lieferant enthalten ist. Wird die Aufgabe wie folgt modifiziert, so führt nur die nachfolgende Lösung zum Erfolg.

Erstellen Sie eine Artikelliste in der alle Artikel enthalten sind, und zu jedem Artikel der Stammlieferant (soweit vorhanden) angegeben wird

Hier führt ein sog. "LEFT OUTER JOIN" zum Erfolg, der das nachfolgende Ergebnis liefert.

SELECT ArtNr, Bezeichnung, Name, Ort
FROM Artikel, Lieferanten
WHERE Artikel.StammLief = Lieferanten.LiefNr
    OR Artikel.StammLief = NULL

SELECT ArtNr, Bezeichnung, Name, Ort
FROM Artikel LEFT OUTER JOIN Lieferanten
ON Artikel.StammLief = Lieferanten.LiefNr

 

ArtNr Bezeichnung Name Ort
100 Bohrer Kugler GmbH Kremmen
101 Pinsel Trims OHG Berlin
103 Hammer Kugler GmbH Kremmen
105 Zange Kugler GmbH Kremmen
110 Kelle Auf & Ab KG Bernau
111 Gips NULL NULL
112 Zement NULL NULL

LEFT OUTER JOIN (linksseitige Außenverknüpfung) Enthält sämtliche Zeilen der im FROM-Statment genannten Tabelle, auch solche, die im Vergleichskriterium NULL-Werte enthalten und verknüpft diese mit der Tabelle auf der Lieferanten. Kurz: Ein "LEFT OUTER JOIN" enthält alle Zeilen, die ein "INNER JOIN" liefern würde und zusätzlich alle die Zeilen der linken Tabelle, die beim Vergleichskriterium einen NULL-Werte enthalten.

SELECT ArtNr, Bezeichnung, Name, Ort
FROM Artikel LEFT OUTER JOIN Lieferanten
       ON Artikel.StammLief = Lieferanten.LiefNr

 

RIGHT OUTER JOIN (rechtsseitige Außenverknüpfung) Enthält sämtliche Zeilen der im JOIN-Statement genannten Tabelle, auch solche, die im Vergleichskriterium NULL-Werte enthalten und verknüpft diese mit der Tabelle auf der linken Seite (hier ebenfalls Lieferanten). Kurz: Ein "RIGHT OUTER JOIN" enthält alle Zeilen, die ein "INNER JOIN" liefern würde und zusätzlich alle die Zeilen der rechten Tabelle, die beim Vergleichskriterium einen NULL-Werte enthalten.

(Eine rechtsseitige Außenverknüpfung liefert dieselben Ergebnisse wie eine linksseitige Außenverknüpfung, wenn die Spalten entsprechend vertauscht werden – she. Folgendes Beispiel.)

SELECT ArtNr, Bezeichnung, Name, Ort
FROM Lieferanten RIGHT OUTER JOIN Artikel
    ON Artikel.StammLief = Lieferanten.LiefNr

 

FULL OUTER JOIN (vollständige Außenverknüpfung)

Enthält sämtliche Reihen, die in der Bedingung übereinstimmen sowie übereinstimmenden Reihen aus sowohl der linksseitigen als auch der rechtsseitigen Tabelle.

Kurz: Ein "FULL OUTER JOIN" enthält alle Zeilen, die ein "INNER JOIN" liefern würde und zusätzlich alle Zeilen sowohl der linken wie auch rechten Tabelle, die beim Vergleichskriterium einen NULL-Werte enthalten.

SELECT ArtNr, Bezeichnung, Name, Ort
FROM Artikel FULL OUTER JOIN Lieferanten
      ON Artikel.StammLief = Lieferanten.LiefNr


[Startseite OSZ | Startseite Gymnasiale Oberstufe | Informatik | Unterrichtsmaterialien]
[ Datenbanken]
[Textanfang]

© 05. April 2006    Hartmut Härtl