Возможный дубликат: sql: объяснение самосоединений
Что такое self join и когда вы его используете? Я не понимаю самосоединения, поэтому было бы здорово получить объяснение с примером.
Самостоятельное объединение используется, когда таблица ссылается на данные в самой себе.
Например, таблица 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
Ну, одним из классических примеров является где вы хотите получить список сотрудников и их непосредственных руководителей:
select e.employee as employee, b.employee as boss
from emptable e, emptable b
where e.manager_id = b.empolyee_id
order by 1
Это's в основном используется там, где есть какая-то связь между строк, хранящихся в одной таблице.
И так далее...
Самостоятельное объединение - это просто объединение таблицы с самой собой. Здесь нет ключевого слова SELF JOIN
, вы просто пишете обычное соединение, где обе таблицы, участвующие в соединении, являются одной и той же таблицей. Следует отметить, что при самоприсоединении необходимо использовать псевдоним для таблицы, иначе имя таблицы будет неоднозначным.
Это полезно, когда вы хотите сопоставить пары строк из одной таблицы, например, отношения "родитель - ребенок". Следующий запрос возвращает названия всех ближайших подкатегорий категории 'Кухня'.
SELECT T2.name
FROM category T1
JOIN category T2
ON T2.parent = T1.id
WHERE T1.name = 'Kitchen'
В SQL самосоединение просто обычный Join, который использован для того чтобы соединить таблицу с самой собой.
Пример:
Select *
FROM Table t1, Table t2
WHERE t1.Id = t2.ID
Вы используете самосвязь в таблице, которая "ссылается" на саму себя - например, таблица сотрудников, где managerid является внешним ключом к employeeid в той же таблице.
Пример:
SELECT E.name, ME.name AS manager
FROM dbo.Employees E
LEFT JOIN dbo.Employees ME
ON ME.employeeid = E.managerid