Database
 sql >> база данни >  >> RDS >> Database

SQL Self Join

Тази статия предоставя общ преглед на самостоятелното присъединяване в SQL, както и основен пример.

Какво е самостоятелно присъединяване?

SQL SELF JOIN присъединява маса към себе си. Може да бъде полезно за запитване на йерархични данни в една и съща таблица или за сравняване на редове в същата таблица.

Пример 1 – Самостоятелно ляво присъединяване

Класически пример за самостоятелно присъединяване е в таблица на служителите. В такава таблица един служител може да докладва на друг служител. Следователно, можете да използвате самостоятелно присъединяване, за да се присъедините към таблицата в колоната за идентификационен номер на служител и колоната с идентификационен номер на мениджър.

Да предположим, че имаме следната таблица:

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

Можем да направим самостоятелно ляво присъединяване на тази маса, за да върнем всички служители и техните мениджъри.

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;

Резултат:

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

Хоумър Конъри и Мардж Морисън не докладват на никого и затова техният Manager полето е празно. Всъщност би било NULL ако не бях извършил конкатенация на низове на двете колони.

Пример 2 – Самостоятелно вътрешно присъединяване

Ако не искаме двете глави да бъдат върнати, тогава бихме могли да направим вътрешно свързване на масата. Това ще елиминира всички редове, които нямат съвпадение и в двете таблици (т.е. тези служители, които нямат съответен мениджър и обратно).

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;

Резултат:

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

Пример 3 – Самоправно присъединяване

Ако искаме да направим самостоятелно правилно присъединяване, ще трябва да разбъркаме няколко колони в заявката.

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;

Резултат:

+-----------------+------------------+
| 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. Съпоставяне на предлагането с търсенето — Решения, част 3

  2. Съвпадение на предлагането с търсенето

  3. Извличане на пълни съобщения за грешка в isql

  4. Свързване на Microsoft Excel към Xero

  5. Основи на sys.dm_exec_requests