Den här artikeln ger en översikt över självanslutningen i SQL, samt ett grundläggande exempel.
Vad är en Self Join?
SQL SELF JOIN
ansluter sig till ett bord för sig själv. Det kan vara användbart för att söka efter hierarkisk data inom samma tabell eller för att jämföra rader inom samma tabell.
Exempel 1 – Självvänsteranslutning
Ett klassiskt exempel på självanslutning finns i en tabell för anställda. I en sådan tabell kan en anställd rapportera till en annan anställd. Därför kan du använda en självanslutning för att gå med i tabellen i kolumnen för anställd-ID och chefs-ID.
Anta att vi har följande tabell:
+--------------+-------------+------------+-------------+ | 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 | +--------------+-------------+------------+-------------+
Vi kan göra en "self left join" på det här bordet för att returnera alla anställda och deras chefer.
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:
+------------------+-----------------+ | 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 och Marge Morrison rapporterar inte till någon och därför deras Manager
fältet är tomt. Egentligen skulle det vara NULL
om jag inte hade utfört en strängsammansättning på de två kolumnerna.
Exempel 2 – Self Inre Join
Om vi inte ville att de två huvudhonchosna skulle returneras, då kunde vi göra en inre sammanfogning på bordet. Detta kommer att eliminera alla rader som inte har en matchning i båda tabellerna (dvs. de anställda som inte har en motsvarande chef och vice versa).
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:
+------------------+-----------------+ | 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 | +------------------+-----------------+
Exempel 3 – Self Right Join
Om vi ville göra en "self right join" skulle vi behöva blanda runt några kolumner i frågan.
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 | 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 | +-----------------+------------------+