Использование самосоединений
До сих пор мы использовали соединения с различными таблицами. В некоторых случаях может потребоваться извлечь и сравнить строки из таблицы с другими строками из той же таблицы. Например, в приложении для отдела кадров таблица Employee может содержать сведения о руководителе каждого сотрудника и хранить идентификатор руководителя в собственной строке сотрудника. Каждый руководитель также указан как сотрудник.
ИдентификаторСотрудника
Имя
ИдентификаторМенеджера
1
Дан
Отсутствует
2
Айша
1
3
Рози
1
4
Наоми
3
Чтобы получить сведения о сотруднике и сопоставить их с соответствующим руководителем, можно дважды использовать таблицу в запросе, присоединив ее к самой себе в целях запроса.
SELECT emp.FirstName AS Employee,
mgr.FirstName AS Manager
FROM HR.Employee AS emp
LEFT OUTER JOIN HR.Employee AS mgr
ON emp.ManagerID = mgr.EmployeeID;
Результаты этого запроса содержат строку для каждого сотрудника с именем его руководителя. У генерального директора компании нет руководителя. Чтобы включить генерального директора в результаты, используется внешнее соединение, и имя руководителя возвращается как значение NULL для строк, в которых поле ManagerID не имеет соответствующего поля EmployeeID.
Код сотрудника
Менеджер
Дан
Отсутствует
Айша
Дан
Рози
Дан
Наоми
Рози
Существуют и другие сценарии, в которых требуется сравнивать строки в таблице с другими строками в этой же таблице. Как уже поняли, сравнивать столбцы в одной строке с помощью T-SQL довольно просто, но метод сравнения значений из разных строк (например, сравнение строки, хранящей время начала, и другой строки в той же таблице, хранящей соответствующее время окончания) менее очевиден. Для запросов таких типов целесообразно использовать самосоединения.
Для выполнения таких задач следует принимать во внимание следующие рекомендации.
- Определите два экземпляра одной таблицы в предложении FROM и при необходимости объедините их, используя внутренние или внешние соединения.
- Используйте псевдонимы таблиц для различия двух экземпляров одной и той же таблицы.
- Используйте предложение ON для предоставления фильтра, сравнивающего столбцы одного экземпляра таблицы со столбцами из другого экземпляра таблицы.