sql >> Database teknologi >  >> RDS >> Database

SQL Self Join

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

  1. Batch Mode Bitmaps i SQL Server

  2. Sådan får du MySQL-tabellens primærnøgle til automatisk at stige med et præfiks

  3. Sådan indstiller du statuslinjefarve i SSMS til forskellige SQL Server-forekomster - SQL Server / TSQL vejledning del 6

  4. 7 fakta om SQL Server-synonymer, du bør kende