我觉得这是一个常见问题,我什至在一些 SQL 挑战中也看到过它,但就我的一生而言,无法清楚地思考解决方案。
假设你的层次结构不均匀。属于其他元素但您不知道顶部的元素。
为了保持简单,我们假设这是一个公司组织结构图(实际上它是任务依赖关系,但是呃)。
所以就有了一张桌子。员工姓名和老板姓名。
Employee name: Bob .... Boss Name: Dora
Employee name Dora .... Boss Name: Kim
不断地。就我而言,还有一条附加信息。一个人只能向一个人汇报。一对一的关系。
链顶部有 N 个元素,其名称为:Whoever Boss:Null。
所以我正在做如下事情:
select employee_name, boss_name
from boss_table b1
left join boss_table b2 on b1.boss_name = b2.employee_name
left join boss_table b3 on b2.boss_name = b3.employee_name
不断地尝试找到每个员工的“根本老板”或“最高老板”。然而,其中一些嵌套元素非常深——我不想进行 20 个连接……或者至少把它们写出来——我觉得递归函数是显而易见的答案,但无法弄清楚——想法?
您正在寻找的称为“递归 CTE”。这是在数据库系统中实现递归的最常见构造之一。递归 CTE 是一个临时命名结果集,它通过自引用来生成结果,类似于传统递归函数的工作方式。
上述文档中的组织结构图示例:
以下是在 Snowflake 中实现递归 CTE 的一些其他示例。