我有一个相当简单的自引用表,如下所示:
表1
id parent_id
1 NULL
2 1
3 NULL
4 1
5 2
6 5
7 2
8 4
我需要生成一个新表,其中对于每个元素,它们的所有后代都是相关联的。见这个例子:
表2
element descendants
1 2
1 5
1 6
1 7
1 4
1 8
2 5
2 6
2 7
5 6
4 8
请注意3
不存在,因为它没有任何子项。
如何使用存储过程实现此目的?我可以得到一个直接的亲子关系,但是我很难获得给定元素的所有后代。
(真实世界表是~15k行& ~7级层次结构,但是它没有预定义等级,所以假设是N)
答案 0 :(得分:1)
这可以通过递归CTE完成。 MySQL现在支持递归CTE,如MySQL Server Blog。
中所述假设一个名为“self_ref”的表,递归CTE将类似于:
with recursive ref(element, descendant) as (
select parent_id, id from self_ref
union
select element, id
from ref as r
inner join self_ref as s on s.parent_id = r.descendant
where parent_id is not null
)
select element, descendant from ref
where element is not null
order by element, descendant;
(这是为Postgres编写的,但如果不相同,MySQL语法也类似。)