Recursive Views
RECURSIVE VIEW declarations with a named working table.Recursive view
SCHEMA public {
RECURSIVE VIEW org_tree (id, parent_id, depth, path) AS
SELECT id, parent_id, 0, ARRAY[id]
FROM departments WHERE parent_id IS NULL
UNION ALL
SELECT d.id, d.parent_id, t.depth + 1, t.path || d.id
FROM departments d JOIN org_tree t ON d.parent_id = t.id;
}
-- emits
CREATE OR REPLACE RECURSIVE VIEW "public"."org_tree"
("id", "parent_id", "depth", "path") AS
SELECT id, parent_id, 0, ARRAY[id]
FROM departments WHERE parent_id IS NULL
UNION ALL
SELECT d.id, d.parent_id, t.depth + 1, t.path || d.id
FROM departments d JOIN org_tree t ON d.parent_id = t.id;
Recursive views follow the same diffing rules as regular views: query body changes emit CREATE OR REPLACE; output column list changes emit DROP + CREATE (DESTRUCTIVE).