PostgreSQL の再帰SQL

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