Informatik

Selbstverbund

Manchmal muss man eine Tabelle mit sich selbst verbinden. Das klingt seltsam, ist aber die einzige Möglichkeit, Zeilen derselben Tabelle miteinander zu vergleichen.

Das Problem

Welche zwei Bands spielen am selben Tag auf derselben Bühne? Alle nötigen Angaben stehen in auftritt – aber in verschiedenen Zeilen. Und eine WHERE-Bedingung sieht immer nur eine Zeile auf einmal.

Die Lösung: zwei Namen für dieselbe Tabelle

Die Tabelle steht zweimal im FROM und bekommt zwei verschiedene Aliasnamen. Danach verhält sie sich wie zwei unabhängige Tabellen: a1 liefert die eine Zeile, a2 die andere.

Die Aliasnamen sind hier keine Bequemlichkeit, sondern zwingend – ohne sie wüsste die Datenbank nicht, welche der beiden Kopien gemeint ist.

Warum die dritte Bedingung nötig ist

Entferne die Zeile AND a1.auftritt_id < a2.auftritt_id und führe die Abfrage erneut aus.

a) Wie viele Zeilen kommen jetzt heraus statt vorher?

b) Zwei Arten von unerwünschten Zeilen tauchen auf. Welche?

c) Ersetze < durch <>. Welche der beiden Arten verschwindet dadurch, welche nicht?

Tipp: Sieh dir die erste Zeile genau an

Was passiert, wenn a1 und a2 dieselbe Zeile sind? Alle drei Bedingungen des Verbunds sind dann erfüllt.

Lösung. Erfrage das Passwort bei deiner Lehrkraft.

Ein zweites Beispiel

Welche Personen spielen in derselben Band?

Fünf Tabellen im FROM, aber nur drei verschiedene. Zeichne auf, welche Zeile welcher Tabelle jeweils gemeint ist – dann wird die Abfrage schlagartig übersichtlich.

Genau das ist der Grund, warum Aliasnamen bei Selbstverbunden aussagekräftig sein sollten: m1/m2 und p1/p2 sagen mehr als x und y.

Aufgaben

a) Welche Bandpaare stammen aus demselben Herkunftsland? Zeige Land und beide Bandnamen, jedes Paar nur einmal.

b) Welche Bühnenpaare haben zusammen eine Kapazität von mehr als 5000? Zeige beide Bühnennamen und die Summe.

c) Welche Personen sind im selben Jahr geboren? Zeige Jahr und beide Namen.

Tipp: das Gerüst ist immer dasselbe
SELECT
  FROM tabelle AS t1
  JOIN tabelle AS t2
    ON t1.gemeinsames_merkmal = t2.gemeinsames_merkmal
   AND t1.schluessel < t2.schluessel

Die erste ON-Bedingung sagt, was gleich sein soll. Die zweite verhindert Selbstvergleiche und Doppelungen.

Lösung. Erfrage das Passwort bei deiner Lehrkraft.

Selbsttest

Selbstverbund

Teilbare URL erstellen

Abschnitte auswählen