Am 14. September 2017 haben wir eine überarbeitete Fassung unserer Datenschutzrichtlinie veröffentlicht. Wenn Sie video2brain.com weiterhin nutzen, erklären Sie sich mit diesem überarbeiteten Dokument einverstanden. Bitte lesen Sie es deshalb sorgfältig durch.

SQL Grundkurs 2: Aufgaben und Lösungen

Beispiel 15: Kriterien mit OUTER JOIN, MINUS/EXCEPT, NOT IN

LinkedIn Learning kostenlos und unverbindlich testen!

Jetzt testen Alle Abonnements anzeigen
Ihre Datenbank enthält Artikelgruppen, denen kein einziger Artikel zugeordnet ist. Löschen Sie diese Gruppen, um Ihre Datenbank zu bereinigen.

Transkript

In diesem Beispiel zur Delete-Anweisung möchten wir alle Artikelgruppen, denen kein einziger Artikel zurgeordnet ist, löschen. Dazu müssen wir uns natürlich überlegen, wie wir herausfinden, welche die betroffenen Artikelgruppen sind. Wir benötigen dazu einerseits die Tabelle "Artikelgruppen" und natürlich auch die Tabelle "Artikel", denn dort findet ja gegebenenfalls eine Zuordnung statt. Welche Möglichkeiten haben wir nun, herauszufinden, welche die betroffenen Artikelgruppen sind? Als erste Variante fällt Ihnen natürlich hier wahrscheinlich sofort ein Outer Join ein, mit dem Sie alle Artikelgruppen eruieren können, für die es in der Tabelle "Artikel" keine Entsprechung gibt. Das ist eine sehr gebräuchliche Variante. Bei Microsoft SQL Server oder bei Oracle können Sie natürlich mit den entsprechenden Set-Operatoren arbeiten. indem Sie jene Artikelgruppen für die es eine Zuordnung gibt, abziehen. Das wäre der Set-Operator "MINUS" bei Oracle oder "EXCEPT" beim Microsoft SQL Server. Dazu gibt es ja bei MySQL keine Entsprechung. Die auf diese Art eruierten Artikelgruppen können Sie über eine Unterabfrage zum Löschen auswählen. Aber manchmal – vielleicht kommen Sie ja drauf – gibt es noch eine einfachere Lösung, die vielleicht nicht immer sofort ins Auge sticht. Überlegen Sie einmal, ob es nicht auch möglich wäre, alle zu löschen, die nicht in der Gruppe sind, die eine Zuordnung haben. Mehr will ich jetzt aber einmal gar nicht verraten, versuchen Sie eine dieser drei Lösungen umzusetzen, die ich jetzt skizziert habe. Sie können aber auch, wenn Sie möchten, alle drei in Angriff nehmen. Unter MySQL sind es ja nur zwei, denn den entsprechenden Set-Operator gibt es dort nicht. (Musik läuft) Pausieren Sie nun das Video und lösen Sie die Aufgabe. Wenn Sie damit fertig sind, fahren Sie mit dem Video fort und sehen Sie sich meine Musterlösung an. Vergleichen wir nun unsere Lösungen und starten wir dazu mit Oracle. Hier sehen wir mal prinzipiell das "SELECT" mit dem "OUTER JOIN", das uns alle Artikelgruppen liefert, die keiner Artikelgruppe zugeordnet sind. Das heißt, über den "LEFT OUTER JOIN" sagen wir, wir möchte alle, bei denen irgendeine Spalte aus der Tabelle "Artikel", in dem Fall die "gruppe" zum Beispiel, "a.gruppe IS NULL" ist. Das liefert uns eben diese in diesem Fall fünf Artikelgruppen. Die zweite Variante wäre mit einem dem Set-Operator "MINUS". Wir lesen in der ersten Anweisung alle Artikelgruppen aus, die es gibt. Mit einem "MINUS", mit einem Minus, nehmen wir all jene weg, die es in der Tabelle "Artikel" gibt. Das heißt "SELECT gruppe", "FROM wawi.artikel", "GROUP BY gruppe". Die Gruppierung wäre hier zwar nicht notwendig, weil sie, auch wenn sie öfter vorkommt, auch sauber abgezogen werden würde. Aber ich muss gestehen, meinem ästhetischen "SQL-Feingefühl" würde hier Schaden zugefügt werden, wenn wir hier nicht gruppieren würden und daher nicht sauber nur über die zweite Anweisung an jede Gruppe ein einziges Mal zurückliefern. Aber mit dieser Anweisung bekommen wir prinzipiell dieselben fünf Artikelgruppenkürzel heraus. Die dritte Variante wäre natürlich auch zu sagen, wir wollen alle Artikelgruppen, die nicht in jenen enthalten sind, die eine Zuordnung haben. Das heißt, wir verwenden einfach bei einem Select über die Artikelgruppen Hier "WHERE artgr NOT IN", das heißt ein not in, und in der Unterabfrage, das ist, wenn Sie genau hinsehen, genau dasselbe, wie hier die Abfrage nach dem Set-Operator, alle jene Gruppen, die eine Zuordnung haben. Und alle, die hier nicht enthalten sind, werden angezeigt. Also auch mit dieser Anweisung bekommen wir diese Fünf heraus. Damit haben wir einmal getestet, was wir löschen würden, und können nun diese Drei wahlweise in einer Unterabfrage bei der Delete-Anweisung verwenden. Hier sehen wir die Syntaxvariante der Ersten, das heißt hier genau, diese Abfrage mit dem "OUTER JOIN" in der Unterabfrage, die uns die Artikelgruppen liefert. Wichtig ist, wenn Sie das hineinkopieren, von hier oben zum Beispiel, dass Sie nicht vergessen, hier die zweite Spalte aus der "SELECT"-Klausel, wenn sie enthalten ist, wieder zu löschen, denn sonst bekommen wir hier einen Fehler. Das wäre einmal die eine Möglichkeit, um hier diese fünf Zeilen zu löschen. Sie sehen, dass das funktioniert. Ich mache nun das Ganze rückgängig, damit ich auch die anderen Varianten ausführen kann. Das ist jetzt die zweite Variante mit dem Set-Operator "MINUS" hier verwendet. In der Unterabfrage und auch mit dieser löschen wir fünf Zeilen. Ich mache das noch einmal rückgängig. um letztendlich noch ein letztes Mal mit dieser sehr eleganten und kurzen Anweisung, nämlich mit dem "NOT IN" zu löschen. Das ist meiner Meinung nach eigentlich die einfachste Variante, auch wenn man vielleicht manchmal nicht beim ersten Mal oder beim ersten Versuch besser gesagt, gleich auf diese Lösung kommt. Nun soll das Löschen endgültig sein und deshalb bestätige ich mit einem "COMMIT". Sehr ähnlich schaut die Lösung in dem Microsoft SQL Server aus. Auch hier können wir mit demselben Outer Join die zu löschenden Artikelgruppen ausgeben oder auch mit einem Set-Operator, nur dass der Set-Operator hier nicht auf den Namen, wenn man so sagen möchte, "MINUS" sondern "EXCEPT" hört. Und sonst ist die restliche Anweisung absolut ident, ich wähle hier in der ersten Anweisung alle Artikelgruppe, ziehe dann mit "EXCEPT" jene ab, die in gruppierter Form in der Tabelle vorkommen. Und auch hier gibt es natürlich keinen Unterschied bei der "IN"-Variante. Und auch hier, all drei Lösungen eins zu eins hineinkopiert in die Unterabfrage für das Löschen und das mache ich jetzt hier auch Ich verwende gleich die dritte Anweisung, die kürzeste, um diese fünf Zeilen zu löschen und bestätige mit einem "COMMIT". Ein wenig müssen wir unter MySQL achtgeben. Ich habe hier die ähnliche Ausgangssituation. Hier sind halt momentan in meiner Testdatenbank nur zwei Zeilen, die gelöscht werden können. Und auch hier gibt es jetzt einerseits die Variante mit dem "OUTER JOIN" und andererseits die Variante mit dem "NOT IN". Set-Operator "MINUS" oder "EXCEPT" gibt es ja, wie vorhin erwähnt, nicht, deshalb fällt die dritte Variante weg. Wenn wir uns das Ganze nun mit der entsprechenden Delete-Anweisung ansehen, gibt es jetzt allerdings ein kleines Problem. Die erste Variante hier, nämlich dass wir hier in der Unterabfrage einen Join verwenden, was ja an und für sich vollkommen legitim ist und kein Problem darstellen sollte, führt hier unter MySQL allerdings zu einer Fehlermeldung. "can't specify target table 'artikelgruppen' for update in FROM clause". Das ist eigentlich in keiner Form hier logisch, warum das nicht funktionieren sollte. Es geht aber nicht, die Anweisung ist hier auch, wie sie so in dieser Form hier steht, fehlerfrei. Das müssen wir einfach zur Kenntnis nehmen, das kommt eben auch einmal vor. Und deshalb verwenden wir hier die zweite Variante mit dem "NOT IN" und bekommen nun auf diese Art und Weise doch noch unsere unverwendeten Artikelgruppen gelöscht. Und auch hier bestätige ich das Löschen. Wir haben also hier Unterabfragen benötigt, die uns ausgegeben haben, welche Werte wir löschen möchten. und drei Varianten, um das zu eruieren, haben wir hier wahlweise gesehen. Einerseits alle, die nicht verwendet werden, kann ich über einen Outer Join eruieren. Eine spezielle Form ist die Verwendung des Set-Operators "EXCEPT" oder "MINUS" oder eben kann auch ein einfaches "NOT IN" die Lösung sein. Welche Variante Sie bevorzugen, bleibt Ihnen überlassen.

SQL Grundkurs 2: Aufgaben und Lösungen

Vertiefen Sie Ihre SQL-Kenntnisse. In diesem Workshop erhalten Sie zahlreiche Beispielaufgaben, die Sie selbst lösen können. Anschließend zeigt Ihnen der Trainer die Lösung.

7 Std. 41 min (61 Videos)
Derzeit sind keine Feedbacks vorhanden...
 

Dieses Training setzt SQL-Kenntnisse voraus, wie sie beispielsweise in „SQL lernen und anwenden“ vermittelt werden.

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!