Denne artikel giver et overblik over selv-join i SQL, samt et grundlæggende eksempel.
Hvad er en Self Join?
SQL SELF JOIN
slutter sig til et bord for sig selv. Det kan være nyttigt til at forespørge om hierarkiske data inden for den samme tabel eller til at sammenligne rækker i den samme tabel.
Eksempel 1 – Selvtilslutning til venstre
Et klassisk eksempel på selvtilslutning er i en medarbejdertabel. I en sådan tabel kan en medarbejder rapportere til en anden medarbejder. Derfor kan du bruge en selvtilslutning til at deltage i tabellen på dens medarbejder-id-kolonne og leder-id-kolonne.
Antag, at vi har følgende tabel:
+--------------+-------------+------------+---- ----------+| Medarbejder-id | Fornavn | Efternavn | RapporterTil ||--------------+-------------------------- --------|| 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 | Kok | 7 |+--------------+-------------+-------------+----- --------+
Vi kan lave en selv-tilmelding på dette bord for at returnere alle medarbejdere og deres ledere.
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;
Resultat:
+------------------------+----------------+| Medarbejder | Leder ||----------------+----------------|| 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 og Marge Morrison rapporterer ikke til nogen og derfor deres Manager
feltet er tomt. Faktisk ville det være NULL
hvis jeg ikke havde udført en strengsammenkædning på de to kolonner.
Eksempel 2 – Selv indre forbindelse
Hvis vi ikke ønskede, at de to hovedhonchos skulle returneres, så kunne vi lave en indre join på bordet. Dette vil eliminere alle rækker, der ikke har et match i begge tabeller (dvs. de medarbejdere, der ikke har en tilsvarende leder og omvendt).
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;
Resultat:
+------------------------+----------------+| Medarbejder | 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 |+-----------------+----------------+
Eksempel 3 – Self Right Join
Hvis vi ville lave en selv-rigtig joinforbindelse, ville vi være nødt til at blande et par kolonner rundt i forespørgslen.
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;
Resultat:
+----------------+------------------------+| Manager | Medarbejder ||----------------+------------------------|| | 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 |+-----------------+----------------+