始める無料で始める

同一テーブルの自己結合をエイリアスで扱う

従業員と、同じく従業員であるマネージャーのように、階層構造のデータを含むテーブルを扱うことはよくあります。この場合、同じテーブルを異なる列で結合(自己結合)したくなることがあります。テーブルの複製を作る .alias() メソッドは、この作業に役立ちます。同じテーブル同士なので、結合条件を指定するには where 句だけで十分です。

ここでは、.alias() メソッドを使って employees テーブルを自分自身に結合し、各従業員が誰にレポートしているかを求めるクエリを作成します。

この演習はコースの一部です

Pythonで学ぶデータベース入門

コースを見る

演習の手順

  • employees テーブルのエイリアスを managers という名前で保存します。そのために、employees にメソッド .alias() を適用します。
  • 従業員の name と、そのマネージャーの name を選択するクエリを作成します。マネージャーの name はすでに選択済みです。label を使って、employeesname 列に 'employee' というラベルを付けてください。
  • stmtwhere 句を追加し、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)

コードを編集して実行