同一テーブルの自己結合をエイリアスで扱う
従業員と、同じく従業員であるマネージャーのように、階層構造のデータを含むテーブルを扱うことはよくあります。この場合、同じテーブルを異なる列で結合(自己結合)したくなることがあります。テーブルの複製を作る .alias() メソッドは、この作業に役立ちます。同じテーブル同士なので、結合条件を指定するには where 句だけで十分です。
ここでは、.alias() メソッドを使って employees テーブルを自分自身に結合し、各従業員が誰にレポートしているかを求めるクエリを作成します。
この演習はコースの一部です
Pythonで学ぶデータベース入門
演習の手順
employeesテーブルのエイリアスをmanagersという名前で保存します。そのために、employeesにメソッド.alias()を適用します。- 従業員の
nameと、そのマネージャーのnameを選択するクエリを作成します。マネージャーのnameはすでに選択済みです。labelを使って、employeesのname列に'employee'というラベルを付けてください。 stmtにwhere句を追加し、managersテーブルのid列がemployeesテーブルのmgr列に対応するように一致させます。- ステートメントを
managersテーブルのname列で並べ替えます。 - ステートメントを実行して、すべての結果を保存します。このコードはすでに書かれています。マネージャーとその部下全員の名前が表示されるように、回答を送信してください。
実践的なインタラクティブ演習
このサンプルコードを完成させて、この演習に挑戦してみましょう。
# 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)