美文网首页
Snowflake 强大的递归功能

Snowflake 强大的递归功能

作者: 夜空中最亮的星Simon | 来源:发表于2021-01-15 14:48 被阅读0次

今天,我来说说Snowflake强大的递归功能。可能有些朋友们并不熟悉什么是递归(Recursion),这里我来简单的解释一下。我们就拿公司的管理分布来说,最上面是CEO,他的下面有A,B两位向他汇报。A的下面又有C, D, E向A汇报。以此类推, 我们在数据库表中会看到类似下图显示的样式


雇员和经理

如果某天,有人想知道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的递归功能,绝对代码整洁,读者看得清楚明白。


Snowflake Recursion
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就可以解决多层查找的问题。从图上第一列也可以看出每一个员工分别在第几层,是不是很清楚哈:)

相关文章

网友评论

      本文标题:Snowflake 强大的递归功能

      本文链接:https://www.haomeiwen.com/subject/muqwaktx.html