Ein SQL Self-Join verbindet eine Tabelle mit sich selbst. Die Tabelle erscheint dabei zweimal in der Abfrage – unter zwei verschiedenen Aliasnamen. Ein Self-Join ist also kein eigener JOIN-Typ, sondern ein normaler JOIN, bei dem beide Seiten dieselbe Tabelle betreffen.
Warum eine Tabelle mit sich selbst?
Oft stecken Beziehungen innerhalb einer einzigen Tabelle. Das bekannteste Beispiel ist die Mitarbeiter-Hierarchie: Jeder Angestellte hat eine Spalte vorgesetzter_id, die auf eine andere Zeile derselben Tabelle zeigt.
SELECT m.name AS mitarbeiter, v.name AS vorgesetzter
FROM mitarbeiter m
LEFT JOIN mitarbeiter v ON v.id = m.vorgesetzter_id;
Mit dem Alias m liest man die Mitarbeiter, mit v ihre Vorgesetzten – beide Male aus derselben Tabelle. Der LEFT JOIN sorgt dafür, dass auch der Chef ohne eigenen Vorgesetzten erscheint.
Typische Anwendungen
- Hierarchien: Mitarbeiter–Vorgesetzter, Kategorien–Unterkategorien, Kommentare mit Antworten.
- Paarvergleiche: alle Spielpaarungen aus einer Mannschaftsliste (
a.id < b.idverhindert Duplikate). - Datenqualität: doppelte Datensätze finden, indem man die Tabelle mit sich selbst auf gleiche Werte, aber verschiedene IDs prüft.
So bleibt der Self-Join lesbar
Aliasse sind Pflicht, sonst weiß die Datenbank nicht, welche Spalte gemeint ist. Aussagekräftige Namen wie m und v (oder chef und team) machen die Abfrage deutlich verständlicher als generische Kürzel. Für tiefe Bäume über mehrere Ebenen ist ein Self-Join allein oft unpraktisch – dann hilft ein rekursives CTE (WITH RECURSIVE), das die Ebenen automatisch durchläuft.
Wer ohne Bedingung alle Zeilen einer Tabelle mit allen einer anderen kombinieren will, braucht dagegen einen CROSS JOIN; wer die Verbindung automatisch über gleichnamige Spalten herstellen möchte, einen NATURAL JOIN. Beim Self-Join ist die Bedingung jedoch immer explizit zu setzen.
Verwandte Grundlagen: SQL: JOINs richtig verstehen, Primär- und Fremdschlüssel.