MySQL は、8.x なら再帰SQL( WITH RECURSIVE target AS ...)が使えるらしいが、
今回はPostgreSQL の再帰SQL
再帰SQLクエリを実行するテーブル構造
テーブル名:divison
id | プライマリーキー |
parent_id | 親を指すID |
name | 名称 |
このテーブル、指定のID(id=1)の配下ツリーになるレコード全てを求めるSQL
WITH RECURSIVE r AS ( SELECT id, name, parent_id FROM division WHERE id = 1 UNION ALL SELECT d.id, d.name, d.parent_id FROM division d, r WHERE d.parent_id = r.id ) SELECT r.id, r.name, r.parent_id FROM r
指定ID(id=13)の 祖先(親)を順に求めるSQLクエリ
WITH RECURSIVE ancestor (depth, id, parent_id) AS ( SELECT 0, id, parent_id, name FROM division WHERE id = 13 UNION ALL SELECT ancestor.depth + 1, d.id, d.parent_id, d.name FROM ancestor, division d WHERE ancestor.parent_id = d.id ) SELECT depth, id, name FROM ancestor ORDER BY depth ASC
祖先(親)を求めるクエリの結果、depth は、0始まり整数で順にインクリメントされた結果になる。
例)A→B→C→D と連結している場合、、
depth | id | name |
0 | 13 | D |
1 | 21 | C |
2 | 19 | B |
3 | 3 | A |