INNER JOIN ·
LEFT JOIN ·
Hierarchien ·
Rekursive Queries ·
Vergleiche ·
Best Practices
Ein Self-Join verbindet eine Tabelle mit sich selbst. Er wird verwendet, um Hierarchien abzubilden, Vergleiche innerhalb einer Tabelle durchzuführen oder Beziehungen zwischen Datensätzen derselben Tabelle zu analysieren.
Self-Join bedeutet, dass eine Tabelle mit sich selbst verbunden wird. Dazu werden Aliase verwendet, um die Tabelle zweimal zu referenzieren – einmal als "links" und einmal als "rechts".
| Anwendungsfall | Beschreibung |
|---|---|
| Hierarchien | Mitarbeiter-Vorgesetzte, Kategorien-Baum, Organigramm |
| Vergleiche | Produkte vergleichen, Preisunterschiede innerhalb einer Kategorie |
| Beziehungen | Freundeslisten, Netzwerke, Verweise |
| Duplikate finden | Doppelte Einträge in einer Tabelle identifizieren |
a und b oder m und v) für Self-Joins. Ohne Aliase ist die Abfrage nicht lesbar und nicht ausführbar.
Mitarbeiter-Hierarchien sind der klassische Anwendungsfall für Self-Joins. Jeder Mitarbeiter hat einen Vorgesetzten (Manager), der ebenfalls in der gleichen Tabelle gespeichert ist.
Kategorie-Hierarchien sind ein weiterer häufiger Anwendungsfall. Jede Kategorie kann eine Oberkategorie (Parent) haben, die ebenfalls in der gleichen Tabelle gespeichert ist.
Rekursive CTEs (WITH RECURSIVE) sind die moderne Lösung für tiefe Hierarchien. Sie durchlaufen den Baum rekursiv und sind in PostgreSQL, SQL Server und MySQL 8.0+ verfügbar.
WITH RECURSIVE ... CYCLE verwenden, um Zyklen zu erkennen.
Self-Joins für Vergleiche ermöglichen es, Datensätze innerhalb einer Tabelle zu vergleichen – z.B. Preisunterschiede innerhalb einer Kategorie, Duplikate oder benachbarte Datensätze.
a.id < b.id oder a.id != b.id, um zu verhindern, dass jedes Paar doppelt auftaucht.
Best Practices für Self-Joins helfen, performante, lesbare und wartbare Abfragen zu schreiben. Hier sind die wichtigsten Tipps.
| Praxis | Beschreibung |
|---|---|
| Aliase verwenden | Immer aussagekräftige Aliase (z.B. e/m, a/b, parent/child) |
| LEFT JOIN für NULL | Verwenden Sie LEFT JOIN, wenn Datensätze ohne Partner (z.B. CEO) enthalten sein sollen |
| Indizes anlegen | Indizes auf den Fremdschlüssel-Spalten (z.B. manager_id) beschleunigen Self-Joins |
| WHERE-Klausel prüfen | Bei INNER JOIN werden Datensätze ohne Partner ausgeschlossen |
| Rekursive CTEs nutzen | Für tiefe Hierarchien (mehrere Ebenen) sind rekursive CTEs die beste Lösung |
| Zyklen vermeiden | Achten Sie auf zyklische Beziehungen (z.B. A → B → A) – diese führen zu Endlosschleifen |
EXPLAIN (oder EXPLAIN ANALYZE) um den Ausführungsplan zu analysieren und fehlende Indizes zu identifizieren.
Self-Join
Hierarchie
Kategorien
RECURSIVE
Vergleiche
Best Practices
SELECT e.name, m.name FROM employees e LEFT JOIN employees m ON e.manager_id = m.id;