トップページ > 基礎知識 > SQL > 同じテーブルで自己結合して階層扱いにする
自己結合とは
データベースのテーブルを結合する場合は異なるテーブル同士を用いることが多いですが、同じテーブルを再帰的に結合することを"自己結合"と呼びます。
自己結合を行う場合も対象とするテーブルが同じだけで内部結合(INNER JOIN)や外部結合(OUTER/LEFT/RIGHT JOIN)を用います。
自己結合する場合の条件としてはテーブル内に結合できる ID や文字列が他のレコードにあることで、一つのテーブルで階層を表す場合に利用されます。
今回は下図のように組織の"部"と"課"を登録したテーブル「d_organization」を用意します。
このテーブルにはレコードのユニーク ID となる"oraganization_id"の他、親の ID を指定する"parent_id"があります。
例えば ID が 2 の「総務課」には親 ID に 1 が入っており、oraganization_id が 1 の「総務部」の配下にあることを意味しています。
自己結合する
組織テーブル「d_organization」を階層表示するために次のような SQL で自己結合します。
今回は left outer join を利用しており、結合するテーブルも同じですが区別するために T1 と T2 と区別しています。
SELECT T1.organization_id, T1.parent_id, T1.name, T2.name FROM d_organization T1 left outer join d_organization T2 on T1.organization_id = T2.parent_id;
SQL を実行した結果が下図のようになります。
親 ID が存在する"総務課"はその親 ID の組織の右列に表示されます。
"第一営業課"と"第二営業課"のように同じ親 ID が存在する場合はそれぞれの行で表示されます。
親 ID が値が無い"総務部"や存在しない親 ID の"製造課"には NULL が表示されます。
自己結合できた行だけ表示する場合
上記の left outer join での自己結合では結合できた行と結合できなかった行の全てが表示されますが、次の SQL のように inner join を利用すると結合できた行だけが表示されます。
SELECT T1.organization_id, T1.parent_id, T1.name, T2.name FROM d_organization T1 inner join d_organization T2 on T1.organization_id = T2.parent_id;
関連記事
Windows に Python をインストールして実行する方法
プログラム
Python は AI やディープラーニングで利用されるプログラム言語で IT エンジニアの取得したいスキルの 1 つに挙げられており、まずは簡単な動作確認するために Python を Windows にインストールして実行する方法を紹介する。
内部結合(INNER JOIN)と外部結合(LEFT/RIGHT JOIN)の違い
プログラム
データベースの操作で結合(リレーション)と呼ばれる 1 回の参照で複数のテーブルの情報を合わせて表示する機能があり、結合方法として用意されている内部結合(INNER JOIN)と外部結合(OUTER JOIN)の使い方と違いについて解説する。
Mapbox の地図データをサイト内に埋め込む基本的な使い方
プログラム
ウェブサイトやブログに地図を埋め込む場合に無償または有償で提供されている地図サービスを利用できるが、いくつかある地図サービスの中から Mapbox の地図データをサイト内に埋め込む方法について紹介する。
Google Map API を使ってサイトに地図を埋め込む方法とキーの取得
プログラム
ウェブサイトやブログに地図を埋め込む際に無償または有償で公開されている地図サービスを利用することができるが、その中で Google Map をウェブサイトに埋め込む方法と利用にあたり必要なキーの取得について紹介する。
PHP で「Non-static method *** should not be called statically」が出る場合の対応方法
プログラム
PHP を利用しているとエラーログ等に「Non-static method *** should not be called statically」が表示されることがあり、このエラーが出る原因と対応方法について紹介する。