再帰CTE
SQLのWITH RECURSIVE構文で書く再帰クエリ。組織階層やカテゴリツリーのような木構造の走査、グラフの探索、連番の生成に使う。
典型例は、ある管理職の部下を全員たどるクエリだ。WITH RECURSIVE subs AS (SELECT id, name, boss_id FROM employees WHERE id = ? UNION SELECT e.id, e.name, e.boss_id FROM employees e JOIN subs s ON e.boss_id = s.id) SELECT * FROM subs;
SQL標準には1999年から入っており、PostgreSQLの実装は堅実である。MySQLは8.0(2018年)でようやく対応した。注意点は終了条件の欠落で、無限再帰になるとプランナーは止められず、クエリはそのまま固まる。Neo4jやMemgraphのようなグラフDBのほうが走査は効率的だが、木構造の大半はSQLのCTEで足りる。