此递归如何重复进行?

时间:2019-11-13 04:50:59

标签: database postgresql recursion

我对某些代码有疑问。

我有一个叫做喜剧演员的关系。它具有喜剧演员和先前喜剧演员的属性。因此,第一位喜剧演员鲍勃(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
)

1 个答案:

答案 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。