sql >> Databasteknik >  >> RDS >> Database

SQL Self Join

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        |
+-----------------+------------------+

  1. Oracles återgång till användning i Java (JDBC, Prepared Statement)

  2. SQL Server:Filterutgång för sp_who2

  3. Vad är det snabbaste sättet att bulka infoga mycket data i SQL Server (C#-klient)

  4. DATE_ADD() Exempel – MySQL