我对某些代码有疑问。
我有一个叫做喜剧演员的关系。它具有喜剧演员和先前喜剧演员的属性。因此,第一位喜剧演员鲍勃(Bob)在之前的喜剧演员中没有任何资料。我的问题是,在找到所有子实例之前,该代码如何重复?我只是不能把头缠住它。
我知道第一部分:UNION ALL之前的那一部分选择所有父元素,因此所有没有喜剧演员在其之前执行的喜剧演员(前喜剧演员),但是如何选择父对象下的所有其他喜剧演员? ?是什么使它递归的?
with recursive tree as (
select company, comedian, preceding_comedian, 1 as level
from the_table
where preceding_comedian is null
union all
select ch.company, ch.comedian, ch.preceding_comedian, p.level + 1
from the_table ch
join tree p on ch.preceding_comedian = p.comedian
)
答案 0 :(得分:1)
首先,执行查询的非递归部分:
select company, comedian, preceding_comedian, 1 as level
from the_table
where preceding_comedian is null
并将结果放入“工作表”中。
然后执行查询的递归部分,其中用工作表代替递归CTE:
select ch.company, ch.comedian, ch.preceding_comedian, p.level + 1
from the_table ch
join <work-table> p on ch.preceding_comedian = p.comedian
将结果添加到工作表中(如果使用UNION
而不是UNION ALL
,则将删除结果中的重复项。)
重复第二步,直到工作表不再更改。
结果工作表是CTE的结果。
实际上,它实际上不是递归的,而是“迭代的” CTE。