Использование самосоединений

Завершено

До сих пор мы использовали соединения с различными таблицами. В некоторых случаях может потребоваться извлечь и сравнить строки из таблицы с другими строками из той же таблицы. Например, в приложении для отдела кадров таблица 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 для предоставления фильтра, сравнивающего столбцы одного экземпляра таблицы со столбцами из другого экземпляра таблицы.