Recursive CTE
About
WITH RECURSIVE countdown(val) AS (
SELECT 3 AS val -- Anchor member (base case)
UNION [ALL]
SELECT val - 1 FROM countdown WHERE val > 1 -- Recursive member (self-reference)
)
SELECT * FROM countdown;Example
CREATE TABLE employees (
id SERIAL PRIMARY KEY,
name TEXT,
manager_id INT REFERENCES employees(id)
);
-- Recursive query to get subordinates of employee with id = 1
WITH RECURSIVE emp_tree(id, name, manager_id) AS (
-- Anchor: CEO or root person
SELECT id, name, manager_id
FROM employees
WHERE id = 1
UNION ALL
-- Recursive part: find direct reports
SELECT e.id, e.name, e.manager_id
FROM employees e
INNER JOIN emp_tree et ON e.manager_id = et.id
)
SELECT * FROM emp_tree;Union vs Union All
Union All
Union
Fixing infinite loops
Limiting depth of recusion
Last updated