SQL Grundkurs 1: Die Sprache erlernen

Tipps zu komplexen JOINS

LinkedIn Learning kostenlos und unverbindlich testen!

Jetzt testen Alle Abonnements anzeigen
Erschrecken Sie nicht, wenn Ihnen eine Aufgabenstellung als zu komplex erscheint. Unterteilen Sie die Aufgabe nur in genügend kleine Schritte und Sie werden sehen, die Lösung der Aufgabe ist keine Hexerei. Lassen Sie sich von diesem Video leiten, wie so eine Unterteilung in Einzelschritte anzugehen ist.

Transkript

In diesem Video möchte ich Ihnen ein paar Tipps zur Erstellung von JOINs geben. Vielleicht fällt Ihnen gerade dann der Einstieg in das Thema JOIN etwas leichter. Ich habe hier bereits eine Anweisung erfasst, in der ich den klassischen INNER JOIN zwei Tabellen, die Tabellen "Lager" und "Lagerstand" miteinander gejoined habe. In der Tabelle "Lager" gibt es ein "Lager-Kürzel", eine "Lager-Nummer", und eine Bezeichnung, welche Lager es also gibt. In der Tabelle "Lagerstand", ist vermerkt von welcher Artikelnummer, in welchem Lager, in welcher Menge etwas zu finden ist. Die Artikelnummer wiederum bezieht sich auf die Artikel-Tabelle. Wenn wir jetzt also diese zwei Tabellen miteinander joinen, ich führe diese Anweisung einmal aus, dann sehen wir jetzt hier einerseits die Lagernummer und die Bezeichnung des Lagers, diese zwei stammen aus der Lagertabelle, als auch die Artikelnummer und die Menge, die aus der Tabelle "Lagerstand" entnommen sind. Das Ergebnis lässt sich so interpretieren: Wir sehen jetzt hier z.B. ich habe auch nach der Artikelnummer sortiert und nach der Lagernummer, damit wir das besser sehen, dass dieser Artikel mit dieser Nummer in vier unterschiedlichen Lagern vorkommt. 20 Stück davon liegen in dem Geschäftslager, 10 Stück im Nebenlager 1 und 2 Stück im Nebenlager 2. Da dürfte offensichtlich einmal etwas ordentlich daneben gegangen sein, denn 102 Stück dieses Artikels liegen im Kaputtteile-Lager. Es gibt auch Lagernummern, z.B. Lagernummer 1, hier liegt ja dieser Artikel gar nicht. Auf Grund des INNER JOINs, der ja aus beiden Tabellen nur das anzeigt, was in beiden vorhanden ist, fehlt hier die Lagernummer 1 für diese Artikelnummer. Ich habe diesen JOIN so hier implementiert, dass ich zuerst die Lagertabelle und danach die Lagerstandtabelle hingeschrieben habe. Außerdem habe ich zuerst die Spalte aus der Lagertabelle und dann die Spalte aus der Lagerstandstabelle in der JOIN-Bedingung verwendet. Muss das immer so sein? Gibt es hier eine fixe Reihenfolge? Nein, eigentlich nicht. Prinzipiell sind Sie in der Reihenfolge beim JOIN sehr flexibel. Rein aus Syntax-Erfordernissen wäre es vollkommen egal, mit welcher Tabelle Sie hier beginnen. D.h. ich könnte jetzt auch diese zwei Tabellen hier einfach von der Position her austauschen und zuerst in meinem JOIN die Lagerstandstabelle verwenden und erst danach die Tabelle "Lagerstand". Das würde sich auf das Ergebnis der Anweisung in keinster Weise auswirken. Genauer gesagt: Sie können hier eigentlich nichts falsch machen. Dasselbe gilt für die JOIN-Bedingung: Müssen Sie sich hier groß Gedanken machen, in welcher Reihenfolge Sie hier die zwei Spalten anfügen? Nein, eigentlich nicht. Wir haben definiert, dass der Inhalt dieser Spalte dem Inhalt dieser Spalte entspricht. Ob ich jetzt sozusagen definiere "A ist gleich B" oder in umgekehrter Reihenfolge "B ist gleich A" macht keinen Unterschied. D.h. auch hier können Sie eigentlich keinen Fehler machen. Ich kopiere mir die Anweisung und vertausche jetzt hier die Reihenfolge. Nachdem die Spalten den gleichen Namen tragen brauche ich nur die Präfixe hier verändern und schon habe ich das ausgetauscht. Ich führe die Anweisung aus und wieder bekomme ich das gleiche Ergebnis. Wir sehen also, dass die Reihenfolgen der Tabellen und die Reihenfolgen der Spalten in der JOIN-Bedingung keine Rolle spielen aus Sicht der Syntax. Wie können Sie sich jetzt das Leben leichter machen, wenn Sie einen JOIN mit sehr vielen Tabellen erzeugen möchten und sich hier noch ein wenig schwer tun? Ich habe hier eine Angabe für ein Beispiel zu Beginn hingeschrieben. Und zwar: Welcher Artikel aus welcher Gruppe liegt mit welchem Wert und Menge in welchem Lager? Kaputtteilelager repräsentiert keinen Wert. Das soll ausgeschlossen werden. Für diese Aufgabenstellung brauchen wir diese vier Tabellen: die Artikeltabelle und die Lagertabelle, die über den Lagerstand miteinander verbunden sind und die Artikelgruppen, damit wir für den Artikel, wie gefordert, den Langtext der Artikelgruppe anzeigen können. Außerdem sollen alle Lagerstände, die sich auf das Kaputtteilelager beziehen ausgeschlossen werden. Um den Wert zu berechnen brauchen wir einerseits die Mengen, in denen ein Artikel auf dem Lager liegt, andererseits den Einkaufspreis, um also den Wiederbeschaffungswert hier zu errechnen. Wie können Sie an so eine Aufgabenstellung herangehen? Wenn Sie zu Beginn noch unsicher sind und noch nicht so viel Übung im Schreiben von SQL-Anweisungen haben, empfehle ich Ihnen, die Lösung zu entwickeln. Damit meine ich, dass Sie die Lösung in so viele kleine Einzelschritte wie möglich zerlegen. Jeder dieser Einzelschritte sollte dann kein Problem darstellen. Und so gelangen Sie komfortabel und einfach zur Gesamtlösung. Das heißt ich fange einfach mit einem Step 1 einmal an: Ich nenne das einfach "Basisdatensammlung". Ich exerziere Ihnen das einfach jetzt durch, wie ich mir so eine Entwicklung der Lösung vorstelle. Ich empfehle Ihnen, das zu Beginn, bis Sie entsprechend Übung haben, am Anfang auch so realisieren. Ich muss mich für eine  Tabelle entscheiden, z.B. möchte ich mit der Lagerstandstabelle beginnen. Nachdem ich weiß, dass ich später weitere dazujoinen werde, vergebe ich gleich von Beginn an hier einen Aliasnamen für die Lagertabelle. Und ich möchte die Lagernummer hier angezeigt bekommen und den Lagernamen. Was ich auch gleich realisieren möchte, ist, dass ich für den Lagernamen einen Aliasnamen vergebe, zum Beispiel das "Lager", weil "Name" natürlich in diesem Zusammenhang natürlich nicht so sprechend ist. Das ist eine ganz eine simple, einfache Anweisung, die hier steht. Sinn und Zweck dieser Schritte, dieses Entwickelns der Aufgabenstellung ist, dass man mit kleinen Schritten beginnt, diese jederzeit testet und erst wenn Sie funktionieren dann zum nächsten Schritt übergeht. Gerade am Anfang sollten Sie den nächsten Schritt aus eine Kopie erstellen, D.h. die vorherige Variante stehen lassen. Dann können Sie nämlich, wenn Sie sich irgendwo hin verrannt haben und nicht mehr weiter kommen, einfach noch einmal einen Schritt zurück gehen und es noch einmal versuchen. D.h. ich kopiere mir jetzt einfach diesen Step 1 und mache daraus einen Step 2. Und was möchte ich hier machen? Ich möchte jetzt hier einmal das Filtern erledigen. Und zwar möchte ich das Kaputtteilelager entfernen. Dies bedeutet es kommt jetzt hier eine WHERE-Klausel dazu, in der ich einschränke das die Lagernummer ungleich 5 ist. Wir sehen ja hier, dass das Kaputtteilelager die Lagernummer 5 aufweist "Ungleich 5". Wieder versuche ich, ob die Anweisung funktioniert und wenn das der Fall ist, gehe ich zum nächsten Schritt. Ich kopiere mir die Anweisung und nun beginne ich z.B. mit dem ersten JOIN. Wie wir hier an diesen Beispieltabellen sehen, an der Anordnung im Diagramm, haben wir nicht viele Möglichkeiten. Wenn ich mit der Lagertabelle begonnen habe, kann ich als erstes nur den Lagerstand über die Lagernummer dazujoinen. Das mache ich jetzt hier auch. D.h. ich ergänze jetzt hier INNER JOIN und hole mir hier die Lagerstandstabelle. "LsUmL.Lagnummer ist gleich LS.Lagnummer". Wie wir gehört haben, ist die Reihenfolge der Spalten, wie ich sie hier angebe, nicht relevant. Nun habe ich diese neue Tabelle, also kann ich ja gleich die SELECT-Klausel um die Spalten ergänzen, die ich für mein Endergebnis brauchen werde. In dem Fall wird das die Lagerstandsmenge sein. Die nehme ich hier gleich mit dazu. Und führe diese Anweisung hier aus. Das ist nun unser Zwischenergebnis. Und nun, nachdem dieses ohne Fehler funktioniert, kopiere ich es mir wieder und mache daraus meinen Step 4, das wäre der zweite JOIN. Nun kommt die Artikel-Tabelle dazu: "INNER JOIN wave.Artikel A on Ls. Artikelnummer ist gleich A.Artikelnummer". Was wir für das Gesamtergebnis benötigen ist nun vom Artikel die Bezeichnung. Und was wir auch benötigen werden, ist der Einkaufspreis. Auf Grund des INNER JOINs sehen wir, dass wir, obwohl wir über tausend Artikeldatensätze haben, nur 20 Ergebniszeilen bekommen. Das liegt daran, dass in der Lagerstandstabelle nur sehr wenige Testdaten enthalten sind, das ist hier an dieser Stelle der Flaschenhals. Nun fehlt uns lediglich nur die Artikelgruppe. D.h. im nächsten Schritt, das wäre in dem Fall schon der Step 5, kommt jetzt der dritte und letzte JOIN. Wir ergänzen die Tabelle "Artikelgruppen": "GUmA.Gruppe ist gleich G.ArtGr". Und können jetzt in der SELECT-Klausel auch die Artikelgruppenbezeichnung "G.G8text" ergänzen. Natürlich mit einem schönen sprechenden, sauberen Spalten-Aliasnamen. Und wieder prüfe ich die Anweisung: Noch immer funktioniert sie. Bevor ich jetzt im letzten Schritt, im Schritt 6 z.B., hier noch meine Berechnung ergänze. Wir wollten ja den Wert, D.h. was ich hier noch erledigen muss, ist, dass ich den Einkaufspreis mit der Menge multipliziere. D.h. ich kopiere mir hier die Menge heraus und setze sie hier vor den Einkaufspreis. Von der Reihenfolge her könnte ich das eigentlich hier in eine neue Zeile einmal setzen. Und hier die Reihenfolge noch vertauschen, dann sieht das vielleicht etwas besser aus im Endergebnis. "S-Wert" oder von mir aus auch "Warenwert" als schönen Aliasnamen. Und nun haben wir eigentlich ein fast sauberes Ergebnis. Wenn Sie möchten, können Sie abschließend hier noch eine Sortierung ergänzen. Das mache ich jetzt auch noch oder dabei und ich sortiere das Ganze nach der Artikelbezeichnung, innerhalb der Artikelbezeichnung z.B. nach dem Lager. Achtung, "Lager" ist ja bereits ein Aliasname, deshalb kommt hier kein Tabellenpräfix mehr dazu. Sie sehen jetzt hier eine Anweisung die durchaus schon aus mehreren Teilschritten zusammengefügt werden kann. Die, wenn man noch nicht so viel Übung hat, in einem Guss herunter geschrieben vielleicht nicht so einfach erscheint. Zusammenfassend gebe ich Ihnen den Tipp: In welcher Reihenfolge Sie JOINs realisieren und wie sie die JOIN-Bedingung setzen, welche Spalte Sie zuerst anfügen, das spielt eine untergeordnete Rolle. Das hat keinen Einfluss auf das Ergebnis in erster Linie. Wenn Sie komplexere Aufgabenstellungen haben, empfehlen ich Ihnen, diese, wie hier gezeigt, in einzelne Schritte zu untergliedern. Jeder Schritt für sich allein stellt kein allzu großes Problem dar. Damit können Sie sich Schritt für Schritt dem Endergebnis nähern. Viel Erfolg wünsche ich Ihnen mit dieser Methode.

SQL Grundkurs 1: Die Sprache erlernen

Arbeiten Sie sich in die Grundlagen der Datenbanksprache SQL am Beispiel von Microsoft SQL Server, Oracle und MySQL ein und lassen Sie sich die praktische Nutzung erklären.

14 Std. 40 min (112 Videos)
Derzeit sind keine Feedbacks vorhanden...

Dieser Online-Kurs ist als Download und als Streaming-Video verfügbar. Die gute Nachricht: Sie müssen sich nicht entscheiden - sobald Sie das Training erwerben, erhalten Sie Zugang zu beiden Optionen!

Der Download ermöglicht Ihnen die Offline-Nutzung des Trainings und bietet die Vorteile einer benutzerfreundlichen Abspielumgebung. Wenn Sie an verschiedenen Computern arbeiten, oder nicht den ganzen Kurs auf einmal herunterladen möchten, loggen Sie sich auf dieser Seite ein, um alle Videos des Trainings als Streaming-Video anzusehen.

Wir hoffen, dass Sie viel Freude und Erfolg mit diesem Video-Training haben werden. Falls Sie irgendwelche Fragen haben, zögern Sie nicht uns zu kontaktieren!