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

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

Примеры

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

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

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

USE AdventureWorks2008R2;
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

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

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

SELECT st.Name AS TerritoryName, sp.BusinessEntityID, 
    sp.SalesQuota, sp.SalesYTD
FROM Sales.SalesPerson AS sp
    JOIN Sales.SalesTerritory AS st
        ON sp.TerritoryID = st.TerritoryID
ORDER BY st.Name, sp.BusinessEntityID