首页 > 解决方案 > 这种递归如何重复自身?

问题描述

我对一些代码有疑问。

我有一个叫做喜剧演员的关系。它具有喜剧演员和前喜剧演员的属性。所以第一个喜剧演员说鲍勃,在他的领域中对于前面的喜剧演员是空的。我的问题是,在找到所有子实例之前,这段代码如何重复?我只是无法绕过它。

我知道第一部分: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
)

标签: databasepostgresqlrecursion

解决方案


  • 首先,执行查询的非递归部分:

    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。


推荐阅读