DEV Community

Kaziu
Kaziu

Posted on

SQLの自己結合(self-join)を一番簡単な例で

「同じテーブルを自分自身に結合する」のが自己結合です。
初めて見ると「え、同じテーブルをJOIN…?」と戸惑いますが、
⭐️ 親子・上下の関係が1つのテーブルに入っているときの定番テクニックです。

例:社員テーブル(社員も上司も“社員”)

上司も社員なので、同じ employees テーブルに入っています。

id name manager_id(上司のid)
1 山田(部長) (なし)
2 佐藤 1
3 鈴木 1

「各社員と、その上司の名前を並べて出したい」とき、
employeesもう一度、別名で結合します。

SELECT
  emp.name     AS 社員,
  boss.name    AS 上司
FROM employees AS emp
LEFT JOIN employees AS boss   -- ← 同じテーブルを別名で結合
  ON emp.manager_id = boss.id;
Enter fullscreen mode Exit fullscreen mode

結果:

社員 上司
山田(部長) (なし)
佐藤 山田(部長)
鈴木 山田(部長)

ポイントは「別名(AS)」

同じテーブルなので、AS emp / AS boss別名を付けて別テーブル扱いにするのが肝です。

  • emp.name … 社員本人の名前
  • boss.name … 上司の名前

別名がないと「どっちの name?」が区別できません。

LEFT JOIN にする理由

上司がいない人(部長など)も結果に残したいので LEFT JOIN を使います。
INNER JOIN だと上司がいない行が消えてしまいます。

まとめ

親子・上下の関係が同じテーブルにあるとき、テーブルを別名で自分自身に結合すると「本人+相手」を1行に並べられる。 これが自己結合。

社員×上司、カテゴリ×親カテゴリ、取引先×その親の取引先など、
「同じ種類のもの同士の関係」を1テーブルで持つ設計で活躍します。

Top comments (0)