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.
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.