WITH RECURSIVE

WITHとは

CTE(Common Table Expression)の略で、SQL文の中で一時的なテーブルを作ることができる。

WITH cte_name AS (
  SELECT ...
)
SELECT * FROM cte_name;

WITH RECURSIVEとは

WITHの中で再帰的なクエリを実行することができる。

-- ECサイトのカテゴリーと商品のネスト関係のクエリを取得
-- parent_id = 1のカテゴリーを取得し、その子カテゴリーを再帰的に取得する
WITH RECURSIVE category_group AS (
  SELECT id, name, parent_id
  FROM categories
  WHERE parent_id = 1 -- 親カテゴリーを取得
  UNION ALL
  SELECT c.id, c.name, c.parent_id
  FROM categories c
  INNER JOIN category_group cg ON c.parent_id = cg.id -- 子カテゴリーを取得
)
select * from category_group;

あんまり使う機会はないかもしれないが、再帰的なクエリを実行することができるので、ツリー構造のデータを扱うときに便利。

参考