Database
 sql >> Baza danych >  >> RDS >> Database

Samoprzyłączanie SQL

Ten artykuł zawiera omówienie samodzielnego łączenia w SQL, a także podstawowy przykład.

Co to jest samodołączenie?

SQL SELF JOIN dołącza do siebie stół. Może być przydatny do wykonywania zapytań dotyczących danych hierarchicznych w tej samej tabeli lub do porównywania wierszy w tej samej tabeli.

Przykład 1 – Samodzielne dołączenie

Klasycznym przykładem samodzielnego sprzężenia jest tabela Pracownicy. W takiej tabeli jeden pracownik może podlegać innemu pracownikowi. Dlatego możesz użyć samodzielnego łączenia, aby dołączyć do tabeli w kolumnie Identyfikator pracownika i Identyfikator menedżera.

Załóżmy, że mamy następującą tabelę:

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

Możemy wykonać samodzielne dołączenie na tym stole, aby zwrócić wszystkich pracowników i ich menedżerów.

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;

Wynik:

+------------------+-----------------+
| 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 i Marge Morrison nie podlegają nikomu, więc ich Manager pole jest puste. Właściwie byłoby to NULL gdybym nie wykonał konkatenacji ciągów na dwóch kolumnach.

Przykład 2 – Łączenie wewnętrzne

Jeśli nie chcielibyśmy, aby zwrócono dwie głowy, moglibyśmy zrobić wewnętrzne połączenie na stole. Wyeliminuje to wszystkie wiersze, które nie pasują do obu tabel (tj. pracownicy, którzy nie mają odpowiedniego menedżera i odwrotnie).

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;

Wynik:

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

Przykład 3 – Łączenie własnoręczne

Gdybyśmy chcieli wykonać samo-prawidłowe sprzężenie, musielibyśmy przetasować kilka kolumn w zapytaniu.

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;

Wynik:

+-----------------+------------------+
| 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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. WordPress – Za kulisami, część 2

  2. Sterownik ODBC Quickbooks

  3. T-SQL Wtorek #67:Nowe rozszerzone zdarzenia tworzenia kopii zapasowych i przywracania

  4. Jak filtrowane indeksy mogą być potężniejszą funkcją?

  5. Podział na budżet