Database
 sql >> Datenbank >  >> RDS >> Database

SQL-Self-Join

Dieser Artikel bietet einen Überblick über die Selbstverknüpfung in SQL sowie ein einfaches Beispiel.

Was ist ein Selbstbeitritt?

Der SQL-SELF JOIN verbindet eine Tabelle mit sich selbst. Es kann nützlich sein, um hierarchische Daten innerhalb derselben Tabelle abzufragen oder Zeilen innerhalb derselben Tabelle zu vergleichen.

Beispiel 1 – Self Left Join

Ein klassisches Beispiel für einen Self-Join ist eine Employees-Tabelle. In einer solchen Tabelle kann ein Mitarbeiter einem anderen Mitarbeiter unterstellt sein. Daher könnten Sie einen Self-Join verwenden, um die Tabelle in der Spalte "Mitarbeiter-ID" und "Manager-ID" zu verknüpfen.

Angenommen, wir haben die folgende Tabelle:

+--------------+-------------+------------+-------------+
| EmployeeId   | FirstName   | LastName   | ReportsTo   |
|--------------+-------------+------------+-------------|
| 1            | Homer       | Connery    | NULL        |
| 2            | Bart        | Pitt       | 1           |
| 3            | Maggie      | Griffin    | 1           |
| 4            | Peter       | Farnsworth | 2           |
| 5            | Marge       | Morrison   | NULL        |
| 6            | Lisa        | Batch      | 5           |
| 7            | Dave        | Zuckerberg | 6           |
| 8            | Vlad        | Cook       | 7           |
+--------------+-------------+------------+-------------+

Wir können an dieser Tabelle einen Self-Left-Join durchführen, um alle Mitarbeiter und ihre Manager zurückzugeben.

SELECT
    CONCAT(e1.FirstName, ' ', e1.LastName) AS Employee,
    CONCAT(e2.FirstName, ' ', e2.LastName) AS Manager
FROM Employees e1
LEFT JOIN Employees e2 
ON e1.ReportsTo = e2.EmployeeId;

Ergebnis:

+------------------+-----------------+
| Employee         | Manager         |
|------------------+-----------------|
| Homer Connery    |                 |
| Bart Pitt        | Homer Connery   |
| Maggie Griffin   | Homer Connery   |
| Peter Farnsworth | Bart Pitt       |
| Marge Morrison   |                 |
| Lisa Batch       | Marge Morrison  |
| Dave Zuckerberg  | Lisa Batch      |
| Vlad Cook        | Dave Zuckerberg |
+------------------+-----------------+

Homer Connery und Marge Morrison sind niemandem unterstellt und daher ihre Manager Feld ist leer. Eigentlich wäre es NULL wenn ich keine Zeichenfolgenverkettung für die beiden Spalten durchgeführt hätte.

Beispiel 2 – Self Inner Join

Wenn wir nicht wollten, dass die beiden Chefhonchos zurückgegeben werden, könnten wir einen inneren Join auf dem Tisch machen. Dadurch werden alle Zeilen eliminiert, die in beiden Tabellen keine Übereinstimmung aufweisen (d. h. die Mitarbeiter, die keinen entsprechenden Manager haben und umgekehrt).

SELECT
    CONCAT(e1.FirstName, ' ', e1.LastName) AS Employee,
    CONCAT(e2.FirstName, ' ', e2.LastName) AS Manager
FROM Employees e1
INNER JOIN Employees e2 
ON e1.ReportsTo = e2.EmployeeId;

Ergebnis:

+------------------+-----------------+
| Employee         | Manager         |
|------------------+-----------------|
| Bart Pitt        | Homer Connery   |
| Maggie Griffin   | Homer Connery   |
| Peter Farnsworth | Bart Pitt       |
| Lisa Batch       | Marge Morrison  |
| Dave Zuckerberg  | Lisa Batch      |
| Vlad Cook        | Dave Zuckerberg |
+------------------+-----------------+

Beispiel 3 – Self-Right-Join

Wenn wir einen Self-Right-Join durchführen wollten, müssten wir einige Spalten in der Abfrage verschieben.

SELECT
    CONCAT(e1.FirstName, ' ', e1.LastName) AS Manager,
    CONCAT(e2.FirstName, ' ', e2.LastName) AS Employee
FROM Employees e1
RIGHT JOIN Employees e2
ON e1.EmployeeId = e2.ReportsTo;

Ergebnis:

+-----------------+------------------+
| Manager         | Employee         |
|-----------------+------------------|
|                 | Homer Connery    |
| Homer Connery   | Bart Pitt        |
| Homer Connery   | Maggie Griffin   |
| Bart Pitt       | Peter Farnsworth |
|                 | Marge Morrison   |
| Marge Morrison  | Lisa Batch       |
| Lisa Batch      | Dave Zuckerberg  |
| Dave Zuckerberg | Vlad Cook        |
+-----------------+------------------+