SQL Grundkurs 1: Die Sprache erlernen

Filtern in der JOIN-Bedingung

LinkedIn Learning kostenlos und unverbindlich testen!

Jetzt testen Alle Abonnements anzeigen
Kann man in der JOIN-Bedingung auch filtern? Selbstverständlich! Unter welchen Voraussetzungen dies sinnvoll ist, vermittelt Ihnen der Autor in diesem Video.

Transkript

Filtern kann man nicht nur in der "Where-Klausel", sondern bei Bedarf auch in der "Join-Bedingung". Wozu das gut ist und wann Sie das verwenden können, zeige ich Ihnen in diesem Video. Ich habe folgende Anweisung vorbereitet, die die Tabellen "Personal" und "Abteilungen" miteinander "joint". Hier gibt es eine Beziehung zwischen diesen beiden Tabellen. In der Personaltabelle finden wir das Abteilungskürzel als Fremdschlüssel. Dieses verweist auf die Abteilungsnummer. In der Tabelle "Abteilungen", in der Spalte "Text" finden wir hier den Langtext. Diese beiden habe ich mit dem Namen miteinander gejoint, um für jeden Mitarbeiter hier den Abteilungsnamen noch zusätzlich anzuzeigen. Und damit bekommen wir die Abteilung, den Nachnamen und den Vornamen. Wir möchten aber nun nicht alle Mitarbeiter sehen, sondern z.B. nur unsere weiblichen Mitarbeiterinnen. Dazu kopiere ich mir die Anweisung und ergänze hier eine "Where-Klausel", in der ich definiere, dass in der Spalte "Geschlecht" nur ein Einser drin stehen soll. Das ist daran zu erkennen, dass, ich zeige es kurz mal an: In der Spalte "P. Geschlecht" haben wir hier das Kürzel für das Geschlecht stehen. Und hier haben wir einen Einser für "weiblich" und einen Zweier für "männlich" als Kürzel definiert. Und deshalb muss ich hier einen Einser filtern, um nur die Damen zu erhalten. Und das mache ich jetzt hier auch. Ich ergänze also die Bedingung "Where Geschlecht = 1". Dann bekomme ich jetzt das Ergebnis ausschließlich für unsere Damen. Als nächsten Schritt könnte man nun auf folgende Idee kommen: "Ja, das ist schön, ich sehe jetzt unsere Damen, in welchen Abteilungen sie arbeiten. Mich würde es aber jetzt eigentlich auch interessieren, in welchen Abteilungen gibt es denn eigentlich gar keine Damen, dass die zusätzlich auch mit angezeigt werden." Dann müsste ich anstelle des "Inner join", wie hier, einen "Outer join" realisieren. Wir wollen alle Abteilungen, auch wenn es hier keine Mitarbeiter, in dem Fall Mitarbeiterinnen, gibt. Also wäre es in dem Fall ein "Right outer join", weil hier die Tabelle "Abteilungen" rechts vom Joint-Begriff zu finden ist. Wenn wir jetzt die Anweisungen ausführen, bekommen wir allerdings kein anderes Ergebnis als vorhin. Woran liegt das? Prinzipiell würde uns der "Right outer join" auch Abteilungen anzeigen, in denen es gar keine Mitarbeiter oder keine Damen gibt. Das Problem, das wir hier haben, ist, dass uns die "Where-Klausel", die ja nach dem "Join" wirkt, dieses sozusagen Zwischenergebnis wieder zunichte macht. Denn bei einem "Outer join" enthalten ja alle Spalten der Tabelle, in der es keine Entsprechungen gibt, "null". D.h., dass Abteilungen, in denen es gar keine Mitarbeiter gibt, hätten "null" hier stehen. Und die, die nur Herren haben, die finden wir zwar im Ergebnis auch ohne den "Outer join", Aber die filtern wir heraus. D.h., dieses nachträglich Filtern mittels "Where-Klausel" vernichtet uns unser Ergebnis. Die Lösung ist jetzt eben, dass wir unsere Filter-Bedingung in die Joint-Bedingung einbringen. Wieder kopiere ich mir die Anweisung und ergänze jetzt Folgendes: Ich nehme diese Filterbedingung, schneide Sie aus und hänge sie einfach mit einem "And" direkt hier in der Joint-Bedingung dazu. Die "Where-Klausel", nachdem wir keine weitere Filterbedingung haben, wird obsolet, und ich entferne dieses "where". Was bewirkt das? Das bewirkt, dass die Einschränkung bereits mit in die Joint-Bedingung aufgenommen wird. D.h., er soll alle dazujoinen, die die selbe Abteilung und das Geschlecht "1" haben. Jetzt gibt es aber Abteilungen, wo das nicht zutrifft, entweder, weil es gar keine Mitarbeiter oder eben nur männliche Mitarbeiter. Aber weil das sich noch innerhalb des Joints abbildet, wirkt hier der "Outer join", in dem Fall der "Right outer join", und zeigt auch diese Abteilungen hier an. Ich führe diese Anweisungen aus. Wir hatten vorher 8 Ergebniszeilen. Und jetzt, wenn wir uns das Ergebnis anschauen, haben wir nicht nur 8, sondern in dem Fall 10. Und zwar die Abteilungen "Controlling" und "Lager" sind jetzt hier zusätzlich im Ergebnis mit angezeigt, weil diese Abteilungen eben ohne Damen auskommen müssen. Um also in der Praxis zu verhindern, dass Ihnen eine nach dem "Joint" vorgenommene Filterung Ihr Zwischenergebnis, das sie typischerweise auch mittels "Outer join" vergrößert haben, wieder zunichte macht, können Sie eine Filterbedingung auch in die Joint-Bedingung mit aufnehmen. Diese ist dann Bestandteil der Joint-Bedingung, und wenn es keinen Eintrag dazu gibt, dann wirkt, so wie in diesem Fall, der "Outer join". Und damit war das Ergebnis, das wir hier erzielen wollten, überhaupt erst möglich. Sie sollten jetzt allerdings nicht generell Filter in die Joint-Bedingung transferieren, sondern nur, wenn Sie Szenarien wie dieses hier vorfinden und sonst zum gewünschten Ergebnis nicht kommen können.

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!