Partager via


Utilisation d'auto-jointures

Il est possible de joindre une table sur elle-même dans une jointure réflexive. Vous pouvez utiliser une jointure réflexive lorsque vous souhaitez créer un jeu de résultats qui joint des enregistrements d'une table à d'autres enregistrements de cette même table. Pour faire deux fois référence à une table dans une même requête, vous devez fournir un alias de table pour au moins une instance du nom de table. Cet alias de table permet au processeur de requêtes de déterminer si les colonnes doivent présenter les données à partir de la version droite ou gauche de la table.

Exemples

A. Utilisation d'une jointure réflexive pour rechercher les produits fournis par plusieurs fournisseurs.

L'exemple suivant utilise une jointure réflexive pour rechercher les produits fournis par plusieurs fournisseurs.

Comme cette requête effectue une jointure de la table ProductVendor avec elle-même, la table ProductVendor joue deux rôles. Pour distinguer ces rôles, vous devez donner deux noms d'alias à la table ProductVendor (pv1 et pv2) dans la clause FROM. Ces alias servent à qualifier les noms de colonne dans le reste de la requête. Cet exemple présente l'instruction Transact-SQL de jointure réflexive :

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

B. Utilisation d'une jointure réflexive pour apparier les commerciaux et leurs territoires

L'exemple suivant effectue une jointure réflexive de la table Sales.SalesPerson pour produire une liste de l'ensemble des territoires et des commerciaux qui y travaillent.

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