问题描述
我想在Presto中使用通用表表达式(CTE)编写一个递归查询,以使用如下语法和逻辑来查找“状态演化”层次结构:
with cte as(select 1 n
union all
select cte.n+1 from cte where n<50)
select * from cte
不幸的是,我发现Presto不支持递归WITH查询,如以下链接所述:
我在下面有一个查询结果示例(不是实际的列),我们将其命名为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
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中所有给定父级的最深子级相对应。