I have the following tables:
COURSE_PREREQUISITES
+----------+-------------------------+ | course_id | prerequisite_course_id | +-----------+------------------------+ | 2 | 1 | +-----------+------------------------+ | 3 | 2 | +-----------+------------------------+ | 3 | 5 | +-----------+------------------------+ | 4 | 3 | +-----------+------------------------+ | 6 | 4 | +-----------+------------------------+
My question is: How can I obtain all the course ids a student needs to take before he can take course id 6?
Intended Answer: I should obtain the course id of 1, 2, 3, 4, 5.
Attempts Made: I have tried selecting the prerequisite_course_id of the intended final course id 6, and nesting it within other select statements in order to obtain the full list of prerequisite_course_id, but I am stuck at implementing it, and I do not think this is a viable solution as well.
SELECT prerequisite_course_id FROM course_prerequisites WHERE course_id = 6
Advertisement
Answer
You want a recursive CTE:
with recursive cte as (
select prerequisite_course_id
from course_prerequisites
where course_id = 6
union all
select cp.prerequisite_course_id
from cte join
course_prerequisites cp
on cte.prerequisite_course_id = cp.course_id
)
select *
from cte;
Here is a db<>fiddle.