sql >> Databáze >  >> RDS >> Database

SQL Self Join

Tento článek poskytuje přehled vlastního připojení v SQL a také základní příklad.

Co je to samostatné připojení?

SQL SELF JOIN připojuje stůl k sobě. Může to být užitečné pro dotazování na hierarchická data ve stejné tabulce nebo pro porovnávání řádků ve stejné tabulce.

Příklad 1 – Vlastní levé spojení

Klasickým příkladem vlastního připojení je tabulka Zaměstnanci. V takové tabulce se může jeden zaměstnanec hlásit jinému zaměstnanci. Proto můžete použít vlastní spojení ke spojení tabulky ve sloupci ID zaměstnance a ID manažera.

Předpokládejme, že máme následující tabulku:

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

Můžeme provést samostatné levé spojení na tomto stole a vrátit všechny zaměstnance a jejich manažery.

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;

Výsledek:

+------------------+-----------------+
| 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 a Marge Morrisonová se nikomu nehlásí, a tak jejich Manager pole je prázdné. Ve skutečnosti by to bylo NULL kdybych na dvou sloupcích neprovedl zřetězení řetězců.

Příklad 2 – Self Inner Join

Pokud bychom nechtěli, aby se vraceli dva hlavové honchos, pak bychom mohli udělat vnitřní spojení na stole. Tím se odstraní všechny řádky, které nemají shodu v obou tabulkách (tj. ti zaměstnanci, kteří nemají odpovídající manažer a naopak).

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;

Výsledek:

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

Příklad 3 – Svéprávné připojení

Pokud bychom chtěli provést vlastní správné spojení, museli bychom v dotazu zamíchat několik sloupců.

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;

Výsledek:

+-----------------+------------------+
| 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. mysql - kolik sloupců je příliš mnoho?

  2. SQL není skupinová funkce s jednou skupinou

  3. Získání NoSuchMethodError:javax.persistence.Table.indexes() při provádění dotazu JPA

  4. Funkce REGEXP_COUNT() v Oracle