IniziaInizia gratis

Usare alias per gestire query con join sulla stessa tabella

Spesso ti capiterà di avere tabelle con dati gerarchici, per esempio dipendenti e manager che sono anch’essi dipendenti. Per questo motivo, potresti voler fare un join di una tabella con sé stessa su colonne diverse. Il metodo .alias(), che crea una copia della tabella, aiuta a svolgere questo compito. Trattandosi della stessa tabella, ti serve solo una clausola where per specificare la condizione di join.

Qui userai il metodo .alias() per costruire una query che metta in join la tabella employees con sé stessa per determinare a chi riporta ciascuno.

Questo esercizio fa parte del corso

Introduzione ai database in Python

Visualizza il corso

Istruzioni dell'esercizio

  • Salva un alias della tabella employees come managers. Per farlo, applica il metodo .alias() a employees.
  • Costruisci una query per selezionare il name del dipendente e il name del suo manager. Il name del manager è già stato selezionato per te. Usa label per etichettare la colonna name di employees come 'employee'.
  • Aggiungi a stmt una clausola where per far corrispondere la colonna id della tabella managers con la colonna mgr della tabella employees.
  • Ordina l’istruzione per la colonna name della tabella managers.
  • Esegui l’istruzione e memorizza tutti i risultati. Questo codice è già scritto. Invia la risposta per stampare i nomi dei manager e di tutti i loro dipendenti.

Esercizio pratico interattivo

Prova a risolvere questo esercizio completando il codice di esempio.

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

Modifica ed esegui il codice