【发布时间】:2020-08-04 10:42:40
【问题描述】:
我有以下先验连接 SQL,它基本上从叶节点开始,沿着树向上到达父级“tree-trunc”(级别 1):
with my_tree as (
select 'level 4.1' node, 'level 3.1' parent_node from dual union
select 'level 4.2' node, 'level 3.2' parent_node from dual union
select 'level 3.1' node, 'level 2' parent_node from dual union
select 'level 3.2' node, 'level 2' parent_node from dual union
select 'level 2' node, 'level 1' parent_node from dual union
select 'level 1' node, '' parent_node from dual
)
select level, t.node, t.parent_node, prior t.node child_that_pointed_me_here
from my_tree t
connect by t.node = prior t.parent_node
start with t.node like 'level 4%'
它给了我以下输出:
level node parent_node child_who_pointed_me_here
----- --------- ----------- -------------------------
1 level 4.1 level 3.1
2 level 3.1 level 2 level 4.1
3 level 2 level 1 level 3.1
4 level 1 level 2
1 level 4.2 level 3.2
2 level 3.2 level 2 level 4.2
3 level 2 level 1 level 3.2
4 level 1 level 2
您可以看到指令prior t.node(别名为列child_who_pointed_me_here)将我带到“先前”记录中的数据(即我开始的子节点),这正是我想要的。换句话说,PRIOR 关键字让我可以访问“上一个”记录中的数据。
但我想要的是访问之前的 2 级(或 3 或 4 级)数据。像prior prior t.node 这样的东西。所需的输出如下所示:
level node parent_node child_who_pointed_me_here grandchild_who_pointed_me_here
----- --------- ----------- ------------------------- ------------------------------
1 level 4.1 level 3.1
2 level 3.1 level 2 level 4.1
3 level 2 level 1 level 3.1 level 4.1
4 level 1 level 2 level 3.1
1 level 4.2 level 3.2
2 level 3.2 level 2 level 4.2
3 level 2 level 1 level 3.2 level 4.2
4 level 1 level 2 level 3.2
我已经尝试了明显的prior prior t.node,但它显然只会导致不支持的语法类型错误。
因此的问题是:connect-by SQL 中是否有一个构造可以让我沿着路径返回(或向上)2 个级别?
我正在使用 Oracle 12c 来构建这个 SQL,但任何 SQL 风格的答案都值得赞赏。
【问题讨论】:
-
太棒了,你提供了一个完整的、可重复的小例子,
标签: sql oracle connect-by