Recursive views make it possible to write queries that cannot be written without recursion or iteration.
Example
- Find all (direct or indirect) prerequisite subjects of each course
WITH RECURSIVE rec_prereq(course_id, prereq_id) AS
(
(
SELECT course_id,
prereq_id
FROM prereq
)
UNION
(
SELECT rec_prereq.course_id,
prereq.prereq_id
FROM rec_prereq,
prereq
WHERE rec_prereq.prereq_id = prereq.course_id
)
)
SELECT course_id
FROM rec_prereq;The example view rec_prereq is called the transitive closure of the prereq relation, meaning that it is a relation that contains all pairs (cid, pre) such that pre is a direct or indirect prerequisite of cid.
Recursive views are required to be monotonic.
-
For each step of the recursion, the view must contain all of the tuples it contained in the previous step, plus possibly some more.
-
At some point, no tuple is added to the view after recursion. This final result is called the fixed point of the recursive view definition.