今天,我来说说Snowflake强大的递归功能。可能有些朋友们并不熟悉什么是递归(Recursion),这里我来简单的解释一下。我们就拿公司的管理分布来说,最上面是CEO,他的下面有A,B两位向他汇报。A的下面又有C, D, E向A汇报。以此类推, 我们在数据库表中会看到类似下图显示的样式
![](https://img.haomeiwen.com/i14117775/222e9ec4f8228f32.png)
如果某天,有人想知道C的经理是谁,通常数据分析师会写上一段SQL查询语句如下。用一个JOIN操作就解决了问题,但是目前只看到了一层,如果要看他上面的N多层呢?如果一层就写一个JOIN,N多层岂不是要写N多JOIN了呢,感觉代码要爆了。。
select
emps.title,
emps.employee_id,
mgrs.employee_id as manager_id,
mgrs.title as "MANAGER TITLE"
from employees as emps left outer join employees as mgrs
on emps.manager_id = mgrs.employee_id
order by mgrs.employee_id nulls first, emps.employee_id;
别慌,接下来我来介绍一下Snowflake的递归功能,绝对代码整洁,读者看得清楚明白。
![](https://img.haomeiwen.com/i14117775/2861ddc3194b3a8a.png)
with recursive managers
( recursive_level,
employee_id,
manager_id,
employee_title )
as
(
select 1 as recursive_level,
employee_id,
manager_id,
title as employee_title
from employees
where title = 'President'
union all
select recursive_level + 1,
employees.employee_id,
employees.manager_id,
employees.title as employee_title
from employees join managers
on employees.manager_id = managers.employee_id
)
select * from managers
从以上代码您可以看出,其实递归由两部分组成。一部分是union all上面那部分我称为Base,另一部分是union all下面的一部分也就是我们的递归主题,也就是你想怎么去查找。所以放一个JOIN就可以解决多层查找的问题。从图上第一列也可以看出每一个员工分别在第几层,是不是很清楚哈:)
网友评论