Teil von SELFHTML aktuell Teil von Artikel Teil von Datenbanken Teil von Fortgeschrittene Jointechniken

Fortgeschrittene Jointechniken:
Mehrere Tabellen mit JOIN verknüpfen - unterschiedliche Joinspalten

nach unten Unterschiedliche JOIN-Spalten nutzen
nach unten Ein Beispiel mit LEFT JOIN

Drei Tabellen, zwei unterschiedliche Joinspalten

Ihr Chef will eine Übersicht über die im Monat Oktober bestellten Artikel haben, mit den Detailinformationen zu den Kunden, die diese Bestellungen getätigt haben. Die benötigten Daten verteilen sich auf die Tabellen 'Kunden', 'Bestellungen_Oktober' und 'Positionen'. Diese drei Tabellen sind über unterschiedliche Spalten miteinander verknüpft: 'Kunden' und 'Bestellungen_Oktober' über die Spalte 'KndNr', 'Bestellungen_Oktober' und Positionen über die Spalte 'BestellungsNr'. Somit gibt es nur zwei mögliche Reihenfolgen, die Sie in Betracht ziehen können:

Sie sehen, es macht die Aufgabe einfacher, wenn die Joinspalten unterschiedlich sind.

Lösung:

SELECT
  Artikel,
  Anzahl,
  Preis,
  Datum,
  Vorname,
  Nachname,
  Strasse,
  PLZ,
  Ort
FROM Positionen 
INNER JOIN (Bestellungen_Oktober
INNER JOIN Kunden
ON Bestellungen_Oktober.KndNr = Kunden.KndNr)
ON Positionen.BestellungsNr = Bestellungen_Oktober.BestellungsNr

Artikel         Anzahl  Preis  Datum        Vorname    Nachname   Strasse         PLZ   Ort
--------------- ------- ------ ------------ ---------- ---------- --------------- ----- ------------
CD-Player       2       49.95  2005-10-15   Mustermann Max        Musterweg 1     12345 Musterstadt
DVD-Player      3       59.95  2005-10-15   Mustermann Max        Musterweg 1     12345 Musterstadt
CD xyz          10      15.95  2005-10-15   Mustermann Max        Musterweg 1     12345 Musterstadt
DVD abc         5        9.95  2005-10-15   Mustermann Max        Musterweg 1     12345 Musterstadt
CD-Player       1       51.20  2005-10-16   Mustermann Max        Musterweg 1     12345 Musterstadt
CD xyz extra    20      16.25  2005-10-16   Mustermann Max        Musterweg 1     12345 Musterstadt
DVD-Player      1       64.95  2005-10-16   Musterfrau Katrin     Musterstraße 7  12345 Musterstadt

(7 row(s) affected)

Erläuterung:

Da Sie die Bestellpositionen aller im Oktober bestellten Artikel benötigen, käme für die Verknüpfung zwischen 'Bestellungen_Oktober' und 'Positionen' neben dem hier verwendeten INNER JOIN auch ein LEFT JOIN in Frage. Bestellungen ohne Bestellpositionen sind jedoch uninteressant (würden Sie eine Bestellung, bei der nichts bestellt wird, bearbeiten?), deswegen verlieren Sie durch den INNER JOIN keine Informationen. Ebenso uninteressant sind Bestellungen ohne Besteller, deswegen wird auch für diese Verknüpfung der INNER JOIN verwendet. Bei einer Abfrage, die nur INNER JOINs verwendet, spielt die Reihenfolge der JOIN-Operationen für das Endergebnis keine Rolle. In dieser Hinsicht können Sie somit keinen Fehler machen.

nach obennach unten

Ein Beispiel mit LEFT JOIN

Nun möchte Ihr Chef eine Übersicht über alle Kunden mit den Artikeln, die diese bestellt haben. Auch Kunden ohne Bestellungen sollen mit Vor- und Nachname aufgeführt werden; diese Spalten sollen vorne stehen.

Lösung:

SELECT
  Vorname,
  Nachname,
  Artikel,
  Anzahl,
  Preis,
  Datum
FROM Kunden 
LEFT JOIN (Bestellungen_Oktober
INNER JOIN Positionen
ON Positionen.BestellungsNr = Bestellungen_Oktober.BestellungsNr)
ON Kunden.KndNr = Bestellungen_Oktober.KndNr


Vorname    Nachname   Artikel         Anzahl  Preis   Datum
---------- ---------- --------------- ------- ------- -----------
Mustermann Max        CD-Player       2       49.95   2005-10-15 
Mustermann Max        DVD-Player      3       59.95   2005-10-15 
Mustermann Max        CD xyz          10      15.95   2005-10-15 
Mustermann Max        DVD abc         5        9.95   2005-10-15 
Mustermann Max        CD-Player       1       51.20   2005-10-16 
Mustermann Max        CD xyz extra    20      16.25   2005-10-16 
Musterfrau Katrin     DVD-Player      1       64.95   2005-10-16 
Müller     Lieschen   NULL            NULL    NULL    NULL
Schmidt    Hans       NULL            NULL    NULL    NULL
Becker     Heinz      NULL            NULL    NULL    NULL

(10 row(s) affected)

Erläuterung:

Wenn Sie aus einer Tabelle alle Datensätze benötigen, so ist diese Tabelle ein guter Kandidat für die äußere Verknüpfung, d.h. den JOIN, der als letzter abgearbeitet wird. Da Sie alle Datensätze benötigen, auch wenn es keine Entsprechungen in anderen Tabellen gibt, bietet sich die Verwendung des LEFT JOIN an. Die weitere Argumentation ist die gleiche wie beim vorhergehenden Beispiel, da sich diese Aufgabe nur in diesem Punkt von diesem unterscheidet.

Diese Variante des Mehrfachjoins ist sehr häufig. Die meisten aktuellen relationalen DBMS können n:m-Beziehungen zwischen zwei Tabellen nur mit Hilfe einer Verknüpfungstabelle, also nicht direkt darstellen. In unserem Fall: Ein Kunde kann mehrere Artikel bestellen, der gleiche Artikel kann von mehreren Kunden bestellt werden. Das Auflösen solcher Verknüpfungstabellen erfolgt typischerweise über zwei Joins, die unterschiedliche Spalten verwenden. Sie haben gesehen, dass solche Fälle meist einfacher zu handhaben sind als Mehrfachjoins, die nur eine einzige gemeinsame Spalte nutzen.

Noch komplexere Verknüpfungen von mehr als drei Tabellen lassen sich prinzipiell auf die gleiche Methode lösen, indem Sie das Gesamtproblem schrittweise in einzelne JOIN-Operationen zerlegen. Bedenken Sie aber auch, dass sich nicht jede Aufgabenstellung mit einer einzigen Anweisung lösen lassen muss.

weiter Seite Thetajoin

zurück Seite Mehrere Tabellen mit JOIN verknüpfen - gleiche Joinspalten

Teil von SELFHTML aktuell Teil von Artikel Teil von Datenbanken Teil von Fortgeschrittene Jointechniken

© 2007 bereichsübergreifende Seite Impressum, für diese Seite: E-Mail vinzenzmai@web.de