m:n Beziehungen zu Lookup-Tables mit einem SQL-Befehl erstellen

puzzleBei diesen Beitrag habe ich echt überlegt, ihn unter einem anderen Namen zu veröffentlichen. Ist der Inhalt doch eigentlich sowas von trivial und für Menschen mit mehr als zwei Hirnzellen wahrscheinlich sowieso offensichtlich. Aber das Gefühl, das mich durchflutet hat als mich Erkenntnis küsste war so erfüllend und erhebend, dass ich dieses gerne mit Euch teilen würde.

SQL ist eine geniale Erfindung. Zwar wird es im Moment arg von den schmächtigen noSQL bedrängt, aber es wird wie triumphieren *star-wars-musik-on*, denn die Anderen werden untergehen wie die noAngels, es wird gewinnen wie die Maden über die noMaden, häufiger verwendet werden, so wie es das Ah gegenüber noAh wird und edler sein, wie der Orden gegenüber noRden! Ich bin heute noch auf der Suche nach der vernünftigen Frage, die nicht in ein einziges SQL-Statement verpackt werden kann.*star-wars-musik-off*

Beispiel-Schema

Doch zurück zum Problem: Es seien Entitäten gegeben, die m:n Beziehungen zu „lookup-Werten“ haben. Ein bestehender Wert in einem Set also, das sich selten ändert wie beispielsweise Kategorien, Zustände, Farben, Ländercodes, Geschlechter oder so etwas. Ein weiterer Use Case wäre ein Import, bei dem die Datensätze schon erstellt wurden und nun nur noch die Verbindungen fehlen.

Hier ein Beispiel:
Personen beinhalten, ja ratet mal, Personen.Hier vereinfacht nur mit Namen und Vornamen.
Personentypen bezeichnen die Art der Person. Beispielsweise Lernender, Lehrperson, Verwaltungsangestellter oder auch Schulleiter.

Jede Person kann mehreren Personentypen entsprechen. Diagnose: klassisches m:n mit Verbindungstabelle (personen_personentypen).

ERD-Diagramm einer m:n Beziehung

Die Inhalte der Tabellen gestalten sich folgendermassen:

Personen

+----+---------------+-----------+
| id | name          | vorname   |
+----+---------------+-----------+
|  1 | Schinkler     | Sebastian |
|  2 | Moser         | Hanspeter |
|  3 | Gublinsbacher | Anneli    |
|  4 | Iltis         | Mahara    |
+----+---------------+-----------+

Personentypen

+----+-------------------------+
| id | personentyp             |
+----+-------------------------+
|  1 | Lernender               |
|  2 | Lehrperson              |
|  3 | Verwaltungsangestellter |
|  4 | Schulleiter             |
+----+-------------------------+

Insert kombiniert mit Select

Der alte Ablauf war folgendermassen:

  1. Lese ID von Personen.
  2. Lese ID von Personentypen.
  3. Füge einen neuen Verbindungsdatensatz in personen_personentypen ein.

Doch es geht viel einfacher! Die Werte, die in personen_personentypen eingefügt werden sollen, können direkt im Statement selektiert werden. Grundsätzlich fügt man also das Resultat einer Abfrage ein:

INSERT INTO personen_personentypen
  SELECT p.id, pt.id FROM personen p, personentypen pt
    WHERE p.name='Moser' AND p.vorname='Hanspeter' AND pt.personentyp='Lehrperson'

Wirklich effizient wird es, wenn man gerade mehrere Lookupwerte verbindet:

INSERT INTO personen_personentypen
  SELECT p.id, pt.id FROM personen p, personentypen pt
    WHERE p.name='Gublinsbacher' AND p.vorname='Anneli' AND pt.personentyp IN('Verwaltungsangestellter', 'Schulleiter')

Jaaa, mit so einfachen Dingen kann man mich glücklich und zufrieden machen…

2 Gedanken zu “m:n Beziehungen zu Lookup-Tables mit einem SQL-Befehl erstellen

  1. Pingback: Left join mit MySQL | root1024:~$

  2. Pingback: Webagentur Wittenberg » Blog Archive » LEFT JOIN mit MySQL

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.