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