Utiliser des jointures réflexives
Jusqu’à présent, les jointures que nous avons utilisées ont impliqué différentes tables. Dans certains scénarios, vous pouvez avoir besoin de récupérer et comparer des lignes d’une table avec d’autres lignes de la même table. Par exemple, dans une application de ressources humaines, une table Employee peut contenir des informations sur le responsable de chaque employé et stocker l’ID du responsable sur la propre ligne de l’employé. Chaque responsable est également listé comme employé.
EmployeeID (IDEmployé)
FirstName
ManagerID
1
Dan
NULL
2
Aisha
1
3
Rosie
1
4
Naomi
3
Pour récupérer les informations des employés et les faire correspondre au responsable associé, vous pouvez utiliser la table deux fois dans votre requête, en la joignant à elle-même pour les besoins de la requête.
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;
Les résultats de cette requête ont une ligne pour chaque employé avec le nom de son responsable. Le PDG de la société n’a pas de responsable. Pour ajouter le PDG dans les résultats, on utilise une jointure externe et NULL est retourné comme nom du responsable pour les lignes où le champ ManagerId n’a pas de champ EmployeeID correspondant.
Employé
Manager
Dan
NULL
Aisha
Dan
Rosie
Dan
Naomi
Rosie
Dans d’autres scénarios, vous pouvez avoir besoin de comparer les lignes d’une table avec d’autres lignes de la même table. Comme vous l’avez vu, il est relativement facile de comparer des colonnes dans la même ligne en utilisant T-SQL, mais la méthode pour comparer les valeurs de différentes lignes (par exemple, une ligne qui stocke une heure de début et une autre ligne de la même table qui stocke l’heure de fin correspondante) est moins évidente. L’utilisation des jointures réflexives est une technique utile pour ces types de requêtes.
Pour accomplir ce type de tâches, vous devez prendre en compte les indications suivantes :
- Définissez deux instances de la même table dans la clause FROM et joignez-les en fonction des besoins, en utilisant des jointures internes ou externes.
- Utilisez des alias de table pour différencier les deux instances de la même table.
- Utilisez la clause ON pour fournir un filtre qui compare les colonnes d’une instance de la table aux colonnes de l’autre instance de la table.