Utiliser un alias pour gérer les jointures sur une même table
Il est fréquent d’avoir des tables avec des données hiérarchiques, par exemple des employés
et des managers qui sont eux aussi des employés. Vous pouvez donc vouloir faire une jointure d’une table avec elle-même sur des colonnes différentes. La méthode .alias(), qui crée une copie d’une table, permet
de réaliser cette opération. Comme il s’agit de la même table, il suffit d’une clause where pour préciser
la condition de jointure.
Ici, vous allez utiliser la méthode .alias() pour construire une requête qui joint la table
employees avec elle-même afin de déterminer à qui chacun rend compte.
Cet exercice fait partie du cours
Introduction aux bases de données en Python
Instructions
- Enregistrez un alias de la table
employeessous le nommanagers. Pour ce faire, appliquez la méthode.alias()àemployees. - Construisez une requête pour sélectionner le
namede l’employé et lenamede son manager. Lenamedu manager a déjà été sélectionné pour vous. Utilisezlabelpour étiqueter la colonnenamedeemployeesen'employee'. - Ajoutez une clause where à
stmtpour faire correspondre la colonneidde la tablemanagersavec la colonnemgrde la tableemployees. - Triez l’instruction par la colonne
namede la tablemanagers. - Exécutez l’instruction et stockez tous les résultats. Ce code est déjà écrit. Soumettez la réponse pour afficher les noms des managers et de tous leurs employés.
Exercice interactif pratique
Essayez cet exercice en complétant cet exemple de code.
# Make an alias of the employees table: managers
managers = ____
# Build a query to select names of managers and their employees: stmt
stmt = select(
[managers.columns.name.label('manager'),
____]
)
# Match managers id with employees mgr: stmt_matched
stmt_matched = stmt.where(managers.columns.id == ____)
# Order the statement by the managers name: stmt_ordered
stmt_ordered = stmt_matched.order_by(____)
# Execute statement: results
results = connection.execute(stmt_ordered).fetchall()
# Print records
for record in results:
print(record)