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 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

B. Utilisation d'une jointure réflexive pour apparier les employés et leurs responsables

L'exemple suivant effectue une jointure réflexive de la table HumanResources.Employee pour produire une liste de l'ensemble des responsables et des employés dont ils ont la charge.

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