SELF JOIN ist eine Möglichkeit, eine Tabelle mit sich selbst zu verbinden. Das klingt erstmal komisch: Warum sollte man eine Tabelle mit sich selbst joinen? Aber in der Praxis kommt das ziemlich oft vor. Stell dir zum Beispiel vor, du hast eine Mitarbeitertabelle, und jeder Mitarbeiter hat einen Manager. Der Manager ist selbst auch ein Mitarbeiter, also stehen seine Daten in derselben Tabelle. SELF JOIN hilft uns, Mitarbeiter mit ihren Managern zu verknüpfen.
Formell gesagt ist SELF JOIN einfach ein normaler JOIN, aber wir benutzen dieselbe Tabelle zweimal und geben ihr verschiedene Aliase, damit wir die "Versionen" unterscheiden können.
SELF JOIN kann man benutzen für:
- Hierarchische Beziehungen: Zum Beispiel "Eltern-Kind"-Beziehungen, wie Mitarbeiter und ihr Manager.
- Datenanalyse innerhalb einer Tabelle: Zum Beispiel, um Einträge zu vergleichen, wie das Finden ähnlicher Produkte oder Events.
- Komplexe Abfragen bei Strukturen mit doppelter Logik.
Syntax von SELF JOIN
Lass uns direkt den vereinfachten Syntax von SELF JOIN anschauen:
SELECT
A.column_name,
B.column_name
FROM
table_name A
JOIN
table_name B
ON
A.common_column = B.common_column;
Hier gilt:
table_name Aundtable_name Bsind dieselbe Tabelle, aber mit unterschiedlichen Aliases.A.common_columnundB.common_columnsind die Spalten, die zum Verbinden der Einträge benutzt werden.
Die Aliase (A und B) braucht man, damit das DBMS "versteht", mit welcher "Kopie" der Tabelle du gerade arbeitest.
Beispiele für SELF JOIN
Beispiel 1: Liste der Mitarbeiter und ihrer Manager
Angenommen, wir haben eine Tabelle employees, die so aussieht:
| employee_id | name | manager_id |
|---|---|---|
| 1 | Alex Lin | NULL |
| 2 | Maria Chi | 1 |
| 3 | Otto Song | 1 |
| 4 | Nina Zhao | 2 |
In dieser Tabelle:
employee_id— Mitarbeiter-ID.name— Name des Mitarbeiters.manager_id— Die ID des Managers, der auch einemployee_ideines anderen Mitarbeiters ist.
Aufgabe: Liste der Mitarbeiter und ihrer Manager bekommen.
So löst man das mit SELF JOIN:
SELECT
e.name AS employee_name,
m.name AS manager_name
FROM
employees e
LEFT JOIN
employees m
ON
e.manager_id = m.employee_id;
Ergebnis:
| employee_name | manager_name |
|---|---|
| Alex Lin | NULL |
| Maria Chi | Alex Lin |
| Otto Song | Alex Lin |
| Nina Zhao | Maria Chi |
Hier gilt:
- Tabelle
e— das sind die "Mitarbeiter". - Tabelle
m— das sind auch "Mitarbeiter", aber in der Rolle der "Manager".
Alex Lin hat keinen Manager manager_id = NULL, deshalb bleibt das Feld manager_name im Ergebnis leer.
Beispiel 2: Ähnliche Produkte finden
Angenommen, wir haben eine Tabelle products:
| product_id | product_name | category |
|---|---|---|
| 1 | Kühlschrank | Technik |
| 2 | Waschmaschine | Technik |
| 3 | Smartphone | Gadgets |
| 4 | Tablet | Gadgets |
Aufgabe: Paare von Produkten finden, die zur gleichen Kategorie gehören.
Lösung mit SELF JOIN:
SELECT
p1.product_name AS product_1,
p2.product_name AS product_2
FROM
products p1
JOIN
products p2
ON
p1.category = p2.category
AND
p1.product_id < p2.product_id;
Ergebnis:
| product_1 | product_2 |
|---|---|
| Kühlschrank | Waschmaschine |
| Smartphone | Tablet |
Achte auf die Bedingung p1.product_id < p2.product_id. Damit vermeidest du doppelte Paare, also dass in den Ergebnissen nicht sowohl Kühlschrank — Waschmaschine als auch Waschmaschine — Kühlschrank auftauchen.
Beispiel 3: Hierarchien analysieren (Eltern und Nachkommen)
Noch ein Beispiel: Angenommen, wir haben eine Tabelle categories:
| category_id | category_name | parent_id |
|---|---|---|
| 1 | Technik | NULL |
| 2 | Gadgets | 1 |
| 3 | Computer | 1 |
| 4 | Smartphones | 2 |
Hier gilt:
category_id— Kategorie-ID.category_name— Name der Kategorie.parent_id— Die ID der übergeordneten Kategorie.
Aufgabe: Kategorien mit ihren Eltern-Kategorien verknüpfen.
Abfrage:
SELECT
c1.category_name AS child_category,
c2.category_name AS parent_category
FROM
categories c1
LEFT JOIN
categories c2
ON
c1.parent_id = c2.category_id;
Ergebnis:
| child_category | parent_category |
|---|---|
| Technik | NULL |
| Gadgets | Technik |
| Computer | Technik |
| Smartphones | Gadgets |
Typische Fehler bei SELF JOIN
Aliase vergessen: Wenn du keine Aliase benutzt, kannst du die "Kopien" der Tabelle nicht mehr auseinanderhalten.
Zyklische Verweise: Wenn die Daten zyklische Verweise enthalten (z.B. ein Mitarbeiter ist sein eigener Manager), kann das zu unerwarteten Ergebnissen führen.
Doppelte Ergebnisse: Vergiss nicht, die Ergebnisse zu filtern (z.B. mit p1.product_id < p2.product_id), damit du keine Duplikate bekommst.
SELF JOIN ist ein mächtiges Tool beim Arbeiten mit Daten, und wenn du es richtig einsetzt, kannst du damit komplexe Aufgaben mit Hierarchien, Beziehungen innerhalb von Tabellen und Datenanalyse lösen. Ich hoffe, du siehst jetzt, wie nützlich dieses "Selfie" im SQL-Universum ist!
GO TO FULL VERSION