![]() |
Fortgeschrittene Jointechniken:
|
|
| |
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.
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)
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.
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.
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)
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.
© 2007
Impressum, für diese Seite:
vinzenzmai@web.de