Utiliser un alias pour gérer une autojointure sur la même table
Il arrive souvent que vous ayez des tables qui contiennent des données hiérarchiques, comme des employés
et des gestionnaires qui sont aussi des employés. Pour cette raison, vous pourriez vouloir joindre une table à elle-même sur des colonnes différentes. La méthode .alias(), qui crée une copie d'une table, aide à réaliser
cette tâche. Comme il s'agit de la même table, vous n'avez besoin que d'une clause where pour préciser
la condition de jointure.
Ici, vous utiliserez la méthode .alias() pour construire une requête qui joint la table
employees à elle-même afin de déterminer à qui chacun se rapporte.
Cette activité fait partie du cours
Introduction aux bases de données en Python
Instructions de l’exercice
- 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 gestionnaire. Lenamedu gestionnaire a déjà été sélectionné pour vous. Utilisezlabelpour étiqueter la colonnenamedeemployeescomme'employee'. - Ajoutez à
stmtune clause where pour faire correspondre la colonneidde la tablemanagersà 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 gestionnaires et de tous leurs employés.
Exercice interactif pratique
Essayez cet exercice en complétant ce code d’exemple.
# 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)