【SQL実践|実務向け】実務で差がつく!「自己結合(Self Join)」を使いこなして階層データをスマートに取得する方法

1. 導入:なぜ自己結合が重要なのか

実務の現場では、組織図やカテゴリ分類など、「自分自身の中に自分自身のデータが紐付いている(階層構造)」テーブルを扱う機会が多々あります。例えば、「従業員テーブル」に「上司のID」が含まれている場合などです。このような場合、通常の結合ではなく「自己結合」というテクニックを使うことで、親子関係や関連付けられたデータを1回のクエリでスマートに抽出できるようになります。

2. 基礎知識:自己結合とは何か

自己結合(Self Join)とは、その名の通り「同じテーブルを2つの別々のテーブルとして見なして結合する」手法です。
テーブル名は同じですが、SQL上で区別するために「別名(エイリアス)」を付与するのが必須です。これにより、データベースエンジンは「左側のテーブル(部下)」と「右側のテーブル(上司)」を別個のデータセットとして認識し、結合条件を評価できるようになります。

3. 実装/解決策:別名(エイリアス)が鍵

自己結合を行う際は、`AS` 句を使用してテーブルに別名をつけます。
・左側のテーブルを「部下(staff_member)」
・右側のテーブルを「上司(boss)」
のように役割を持たせることで、直感的にクエリを組み立てることができます。

4. サンプルプログラム:上司の名前を取得するSQL

以下の例では、スタッフテーブルから「自分の名前」と「上司の名前」を並べて表示するクエリを作成します。

— サンプルのスタッフテーブル作成
CREATE TABLE staff (
id INT,
name VARCHAR(10),
bossid INT
);

— テストデータの挿入
INSERT INTO staff VALUES(1, ‘Yamada’, 3), (2, ‘Itou’, 4), (3, ‘Suzuki’, 5), (4, ‘Ueda’, 3), (5, ‘Kuroda’, 0);

— 自己結合によるクエリの実行
— t1を部下側、t2を上司側として結合します
SELECT
t1.name AS 部下名,
t2.name AS 上司名
FROM staff AS t1
LEFT JOIN staff AS t2
ON t1.bossid = t2.id; — 部下のbossidと上司のidを紐付けます

5. 応用・注意点:現場で役立つヒント

自己結合を使用する際には、以下の点に注意してください。

・外部結合(LEFT JOIN)の活用
今回の例では、上司が存在しない(社長など、bossidが0やNULLの場合)ケースを考慮し、`INNER JOIN` ではなく `LEFT JOIN` を使用しました。`INNER JOIN` を使うと、上司がいないレコードが結果から除外されてしまうため、データの取りこぼしがないか常に意識する必要があります。

・パフォーマンスへの配慮
自己結合はテーブルを2回参照するため、大規模なテーブルで行うと負荷が高くなることがあります。結合条件となるカラム(今回の場合は `bossid` や `id`)には、必ずインデックスを貼ることを忘れないでください。

・可読性の向上
`AS` を使った別名は、単に短縮するだけでなく、`staff AS member` や `staff AS manager` のように、役割がわかる名前にすると、後からコードを見た時に格段に読みやすくなります。ぜひ現場の設計に取り入れてみてください。

コメント

タイトルとURLをコピーしました