Поделиться через


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

Таблицу можно соединить с собой в самосоединение. Используйте самосоединение, когда требуется создать результирующий набор, который соединяет записи в таблице с другими записями в той же таблице. Чтобы указать таблицу два раза в одном и том же запросе, необходимо задать псевдоним таблицы хотя бы для одного экземпляра имени таблицы. Этот псевдоним таблицы помогает обработчику запросов определить, какие данные должны быть представлены в столбцах (из правой или из левой версии таблицы).

Примеры

A. Использование самосоединения для поиска товаров, поставляемых несколькими поставщиками

Следующий пример показывает, как самосоединение используется для поиска товаров, поставляемых несколькими поставщиками.

Поскольку следующий запрос соединяет таблицу ProductVendor саму с собой, таблица ProductVendor появляется в двух ролях. Чтобы добиться этих ролей, таблице ProductVendor необходимо назначить два различных псевдонима (pv1 и pv2) в предложении FROM. Эти псевдонимы используются для описания имен столбцов в оставшейся части запроса. Пример инструкции Transact-SQL с самосоединением:

USE AdventureWorks;
GO
SELECT DISTINCT pv1.ProductID, pv1.VendorID
FROM Purchasing.ProductVendor pv1
    INNER JOIN Purchasing.ProductVendor pv2
        ON pv1.ProductID = pv2.ProductID
        AND pv1.VendorID <> pv2.VendorID
ORDER BY pv1.ProductID

Б. Использование самосоединения для установления соответствия между сотрудниками и их менеджерами

В следующем примере выполняется самосоединение таблицы HumanResources.Employee для получения списка всех менеджеров и подотчетных им сотрудников.

SELECT MgrTable.LoginID AS ManagerName,EmplTable.ManagerID, 
    EmplTable.LoginID, EmplTable.EmployeeID
FROM HumanResources.Employee AS EmplTable
    JOIN HumanResources.Employee AS MgrTable
        ON EmplTable.ManagerID = MgrTable.EmployeeID
ORDER BY MgrTable.LoginID, EmplTable.LoginID