database - 这种递归如何重复自身?
问题描述
我对一些代码有疑问。
我有一个叫做喜剧演员的关系。它具有喜剧演员和前喜剧演员的属性。所以第一个喜剧演员说鲍勃,在他的领域中对于前面的喜剧演员是空的。我的问题是,在找到所有子实例之前,这段代码如何重复?我只是无法绕过它。
我知道第一部分: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
)
解决方案
首先,执行查询的非递归部分:
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。
推荐阅读
- javascript - 删除请求后重新加载当前路由
- typescript - 打字稿:返回类型不正确
- javascript - Bootsrat html Toast 不显示
- angular - Angular中的(波浪号)〜和(插入符号)^有什么区别
- javascript - npm install material-ui 不安装最新版本
- spring - 使用 Spring Security 和 LDAP 保护应用程序
- c# - c# 如何为 byte[] 等基本类型制作类型转换器
- php - Json 数组转换为简单的 Json
- oracle - 带输入参数的 Oracle PL/SQL 函数
- reactjs - 使用构造函数选择器找不到酶,但使用显示名称选择器成功