Что такое SELF JOIN и когда бы вы его использовали?

Что такое самосоединение и когда вы его используете? Я не понимаю самосоединений, поэтому объяснение непрофессионала с примером было бы отличным.


person Imran    schedule 29.07.2010    source источник


Ответы (5)


Вы используете самосоединение, когда таблица ссылается на данные сама по себе.

Например, таблица Employee может иметь столбец SupervisorID, указывающий на сотрудника, который является начальником текущего сотрудника.

Чтобы запросить данные и получить информацию для обоих людей в одной строке, вы можете самостоятельно присоединиться следующим образом:

select e1.EmployeeID, 
    e1.FirstName, 
    e1.LastName,
    e1.SupervisorID, 
    e2.FirstName as SupervisorFirstName, 
    e2.LastName as SupervisorLastName
from Employee e1
left outer join Employee e2 on e1.SupervisorID = e2.EmployeeID
person D'Arcy Rittich    schedule 29.07.2010
comment
Это похоже на само внешнее соединение для меня? - person Joe Caruso; 09.12.2016
comment
@JoeCaruso Это потому, что это так;) - person D'Arcy Rittich; 09.12.2016
comment
Интересно, почему никто не подчеркивает часть в той же строке. Разве не в этом весь смысл самостоятельного соединения? - person A. Sallai; 02.01.2017
comment
разве нам не нужно AS при создании псевдонимов для таблиц? - person Manu Chadha; 08.01.2019
comment
@ManuChadha AS не является обязательным - я приму решение на основе удобочитаемости запроса. - person D'Arcy Rittich; 08.01.2019

Ну, один классический пример, когда вы хотели получить список сотрудников и их непосредственных руководителей:

select e.employee as employee, b.employee as boss
from emptable e, emptable b
where e.manager_id = b.empolyee_id
order by 1

В основном он используется там, где есть какая-либо связь между строками, хранящимися в одной таблице.

  • сотрудники.
  • многоуровневый маркетинг.
  • части машины.

И так далее...

person paxdiablo    schedule 29.07.2010
comment
Boo для синтаксиса, отличного от ANSI, и использования порядкового номера в предложении ORDER BY вместо имени столбца. - person D'Arcy Rittich; 29.07.2010
comment
Boo прямо в ответ за то, что вы упустили смысл ответа :-) Я склонен использовать самый простой синтаксис, который работает, поскольку хорошая СУБД не позволит этому повлиять на производительность. - person paxdiablo; 29.07.2010
comment
пока лучший ответ... :) - person Sritam Jagadev; 29.05.2017

Самосоединение — это просто соединение таблицы с самим собой. Ключевого слова SELF JOIN нет, вы просто пишете обычное соединение, в котором обе таблицы, участвующие в объединении, являются одной и той же таблицей. Следует отметить, что при самостоятельном присоединении необходимо использовать псевдоним для таблицы, иначе имя таблицы будет неоднозначным.

Это полезно, когда вы хотите сопоставить пары строк из одной и той же таблицы, например отношения родитель-потомок. Следующий запрос возвращает имена всех непосредственных подкатегорий категории «Кухня».

SELECT T2.name
FROM category T1
JOIN category T2
ON T2.parent = T1.id
WHERE T1.name = 'Kitchen'
person Mark Byers    schedule 29.07.2010
comment
Приятно видеть этот комментарий.. ON T2.parent = T1.id (поскольку это влияет на результат, если мы поменяем местами «родитель» и «id» в нем) - person himanshupareek66; 19.02.2017
comment
Приятно отметить, что нет ключевого слова SELF JOIN. Я был смущен этой частью! - person nclsvh; 12.02.2018

Самосоединение SQL — это просто обычное соединение, которое используется для соединения таблицы с самой собой.

Пример:

Select *
FROM Table t1, Table t2
WHERE t1.Id = t2.ID
person Michael Pakhantsov    schedule 29.07.2010
comment
Не было бы безопаснее использовать SELECT t1.*, чтобы избежать дублирования имен столбцов в результате? - person Matthieu; 28.09.2013

Вы бы использовали самосоединение для таблицы, которая "ссылается" на себя - например. таблица сотрудников, где managerid является внешним ключом для employeeid в той же таблице.

Пример:

SELECT E.name, ME.name AS manager
FROM dbo.Employees E
LEFT JOIN dbo.Employees ME
ON ME.employeeid = E.managerid
person Will A    schedule 29.07.2010
comment
ON ME.employeeid = E.managerid создаст другой результат вместо ON ME.managerid = E.employeeid - person himanshupareek66; 19.02.2017