sql >> Database >  >> RDS >> Database

Zelf lid worden van SQL

Dit artikel geeft een overzicht van de self-join in SQL, evenals een basisvoorbeeld.

Wat is een zelflidmaatschap?

De SQL SELF JOIN voegt zich bij een tafel bij zichzelf. Het kan handig zijn voor het opvragen van hiërarchische gegevens binnen dezelfde tabel of voor het vergelijken van rijen binnen dezelfde tabel.

Voorbeeld 1 – Zelf lid worden

Een klassiek voorbeeld van een self-join is in een Employees-tabel. In zo'n tabel kan de ene medewerker zich melden bij een andere medewerker. Daarom zou u een self-join kunnen gebruiken om deel te nemen aan de tabel in de kolom werknemer-ID en kolom manager-ID.

Stel dat we de volgende tabel hebben:

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

We kunnen een self left join doen op deze tafel om alle medewerkers en hun managers terug te geven.

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;

Resultaat:

+------------------+-----------------+
| 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 en Marge Morrison rapporteren aan niemand en dus hun Manager veld is leeg. Eigenlijk zou het NULL . zijn als ik de twee kolommen niet had samengevoegd.

Voorbeeld 2 – Zelf innerlijk meedoen

Als we niet wilden dat de twee hoofdhoncho's werden teruggestuurd, dan konden we een inner join doen op de tafel. Hiermee worden alle rijen geëlimineerd die geen overeenkomst hebben in beide tabellen (d.w.z. die werknemers die geen corresponderende manager hebben en 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;

Resultaat:

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

Voorbeeld 3 – Zelf-rechts meedoen

Als we een self-right join willen doen, moeten we een paar kolommen in de query door elkaar schudden.

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;

Resultaat:

+-----------------+------------------+
| 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. Hoe kan ik incompatibel oplossen met sql_mode=only_full_group_by in laravel welsprekend?

  2. Hoe kan ik dezelfde query uitvoeren op alle databases op een instantie?

  3. Fix Error Msg 4151 "Het type van het eerste argument voor NULLIF kan niet de NULL-constante zijn omdat het type van het eerste argument bekend moet zijn" in SQL Server

  4. Inzicht in het opslaan van gegevens in SQL-databases door Android.com Zelfstudie