← 피드로
「同じテーブルを自分自身に結合する」のが自己結合です。
初めて見ると「え、同じテーブルをJOIN…?」と戸惑いますが、
⭐️ 親子・上下の関係が1つのテーブルに入っているときの定番テクニックです。
例:社員テーブル(社員も上司も“社員”)
上司も社員なので、同じ employees テーブルに入っています。
「各社員と、その上司の名前を並べて出したい」とき、
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テーブルで持つ設計で活躍します。
추출 본문 · 출처: dev.to · https://dev.to/kaziusan/sqlnozi-ji-jie-he-self-joinwo-fan-jian-dan-nali-de-o98