Aus dem Kurs: SQL Praxisworkshop

Beispiel 4: Einfügen mit SELECT

Aus dem Kurs: SQL Praxisworkshop

Beispiel 4: Einfügen mit SELECT

In diesem Beispiel weisen wir allen Kunden die bereits das Interesse "Werk- und Baustoffe" oder "Heimwerken" aufweisen, das neu erfasste Interesse "Radfahren" zu. Dazu müssen wir die entsprechenden Kundennummern aus der Tabelle "kundeninteressen" auslesen, und auch gleichzeitig wieder einfügen. Diese Anweisung hier liefert uns einen Überblick über die bereits vorhandenen Interessenszuordnungen, d. h. es gib hier einige für das Interesse "BAU", Bau, Werk- und Baustoffe, und weiter unten in der Liste, finden wir auch ein paar Einträge zu "Heimwerk". Allerdings muss bei diesem Bespiel noch etwas berücksichtigt werden. Es ist möglich, dass einem Kunden bereits beide dieser Interessen zugeordnet sind. Das würde bedeuten, beim Auslesen muss man darauf achten, das diesem Kunden nicht versucht wird, das neue Interesse "Radfahren" doppelt zuzuweisen, denn das würde zu einem Fehler führen. Auf das müssen Sie besonders Rücksicht nehmen, wenn Sie das Beispiel nun selbstständig ausführen. Viel Erfolg dabei! 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 die Musterlösung an. Ich bin mir sicher, Sie haben das Beispiel korrekt gelöst. Betrachten wir uns nun das mögliche Ergebnis. Dazu müssen wir in die Tabelle "kundeninteressen", in die Spalten "intcode" und "kundennummer", die Werte einfügen, die wir zuerst mit diesem SELECT auslesen. Ich führe diese Anweisung jetzt einmal separat aus, dieses SELECT, damit sehen wir was wir einfügen würden. Das Interesse Radfahren "RAD" schreibe ich hier fix in das SELECT hinein die Kundennummer wird aus der Tabelle "kundeninteressen" ausgelesen, und gefiltert auf die beiden Interessen "BAU" und "HWE". Wie das Ergebnis hier unten zeigt, kommt allerdings die Kundennummer "121" hier doppelt vor. Fügen wir also diese Werte ein, indem wir diese Anweisung ausführen, laufen wir auf eine Fehlermeldung auf. Wir müssen also verhindern, dass doppelt eingefügt wird. Und das können wir auf unterschiedliche Weise tun. Bevor ich das tue, starte ich wie gewohnt eine Transaktion und kopiere mir diese Anweisung hier einmal her. Eine Möglichkeit, um zu verhindern, dass es zu einem doppelten Einfügen kommt, ist, dass ich hier in meiner SELECT das Schlüsselwort DISTINCT ergänze. Natürlich muss ich auch an der richtigen Stelle diese Einfügung vornehmen, und da habe ich jetzt nicht gut genug aufgepasst. Hier sehen wir das jetzt. Mit einem SELECT DISTINCT werden Duplikate unterdrückt und jetzt wird die Nummer "121" nurmehr einmalig ausgegeben. Und wenn ich jetzt hier diesen Wert einfüge, indem ich die Anweisung ausführe, bekomme ich keine Fehlermeldung mehr. Wir bekommen das Ergebnis "6 Zeilen sind eingefügt worden". Ich kontrolliere das Ergebnis hier mit dieser Anweisung, um mir auszugeben, wer jetzt dieses neue Interesse aufweist. Und ich bekomme genau diese sechs Namen hier ausgelesen. Vorläufig, mache ich das allerdings noch einmal rückgängig, um Ihnen auch die zweite Variante zu zeigen. Duplikate unterdrücken können wir ja nicht nur mit dem Schlüsselwort DISTINCT, sondern z. B. auch durch das Einsetzen einer Gruppierung. Das heißt anstelle hier DISTINCT zu verwenden, ergänze ich hier eine GROUP BY-Klausel. GROUP BY und gruppiere nach der Kundennummer. Ich betrachte mir das Ergebnis vor dem Einfügen noch einmal separat, indem ich es allein markiere, und hier sehen wir nun das Ergebnis, das eingefügt werden wird. Auch hier kommt jetzt die Kundennummer "121" nunmehr einmalig vor, da ich nach der Kundennummer gruppiert habe. Und ebenso führe ich diese Anweisung aus, nachdem ich vielleicht vorher noch einmal die Transaktion neu starte, die ich zurückgerollt habe, füge ich wieder diese Datensätze ein, um wie gewohnt mit einem COMMIT abzuschließen. Und wir kontrollieren das Ergebnis und wir sehen, dass wir sechs Zeilen eingefügt haben. Das sind nun die Kunden, die das neue Interesse "Radfahren" zugewiesen bekommen haben. Wir haben also gesehen, wir können auch mit einem SELECT direkt ein INSERT vornehmen. Das was ausgelesen wird, das Ergebnis wird eingefügt. Unter Umständen muss man darauf achten, dass wir keine Duplikate generieren fürs Einfügen. Das würde zu einer Primärschlüssel-Verletzung führen. Wahlweise kann man solche Duplikate entweder mit einer Gruppierung oder mit einem DISTINCT unterdrücken.

Inhalt