Presto查询父子层次结构

问题描述

我想在Presto中使用通用表表达式(CTE)编写一个递归查询,以使用如下语法和逻辑来查找“状态演化”层次结构:

with cte as(select 1 n
       union all
       select cte.n+1 from cte where n<50)
select * from cte 

不幸的是,我发现Presto不支持递归WITH查询,如以下链接所述:

Does Presto SQL support recursive query using CTE just like SQL Server? e.g. employee hierarchy level

我在下面有一个查询结果示例(不是实际的列),我们将其命名为MY_TABLE:

请注意,以下是我尝试重现数据结构和代码的尝试。我没有创建表的权限,无法确保下面的代码正确无误。如果您尝试过,它肯定对您不起作用,但我希望它能在某种程度上澄清我的疑问

Name    State       PredecessorState
A       A1  
B       B1  
C       C1  
D       D3  
E       E1  
A       A2          A1  
B       B2          B1  
C       C2          C1  
D       D4          D3  
A       A_Temp_1    A1  
B       B3          B4  
C       C3          C2  
D       D5          D4  
B       B4          B2  
B       B_Temp_1    B2  
D       D_Temp_3    D5  
D       D_Temp_6    D5  
D       D_Temp_5    D_Temp_3  
D       D7          D5  
C       C7          C3  

我们如何使用Presto查询获取如下所示的输出

Name     State1     State2      State3     State4      State5    State6     State7
A        A1         A2
A        A1         A_Temp_1
B        B1         B2          B4         B3
B        B1         B2          B_Temp_1
C        C1         C2          C3         C7
D        D3         D4          D5         D_Temp_3
D        D3         D4          D5         D_Temp_3   D_Temp_5
D        D3         D4          D5         D_Temp_6
D        D3         D4          D5         D7
E        E1

我在DBeaver上尝试了类似于以下内容查询,但它给出了错误

sql错误[57]:查询失败(#20200924 _ ****):第25:12行:未设置会话模式时必须指定模式

with PredecessorsAndSuccessors
        (Name,State,PredecessorState,State_Level)
as
(
select Name,0
       
       from MY_TABLE
       where PredecessorState is null   -- Determine the first State (root Parent of Tree),note there are multiple roots

union all

select MY_TABLE1.Name,MY_TABLE1.State,MY_TABLE1.PredecessorState,PredecessorsAndSuccessors.State,PredecessorsAndSuccessors.State_Level + 1
       
       from MY_TABLE as MY_TABLE1
       
       join PredecessorsAndSuccessors on MY_TABLE1.PredecessorState = PredecessorsAndSuccessors.State
)

select *
from PredecessorsAndSuccessors
order by State_Level

我只能加入一个工作,而无法使查询递归多次与MY_TABLE中所有给定父级的最深子级相对应。

解决方法

您可以使用sequenceunnest

with cte as 
(
    select sequence(1,50) n_sequence
)
select t.n
from cte 
cross join unnest(n_sequence) as t(n);