Sql 找到根了吗?我不明白你要的是什么-画简单的图表可能会有帮助。我猜最快的递归查询应该使用递归公共表表达式,因为这样一来,一旦到达第n个节点,CTE就可以停止遍历树了。我不明白。例如,“从给定节点开始的根的第n个节点”。这是什么意思?哪根?你的样品有两个。它是
Sql 找到根了吗?我不明白你要的是什么-画简单的图表可能会有帮助。我猜最快的递归查询应该使用递归公共表表达式,因为这样一来,一旦到达第n个节点,CTE就可以停止遍历树了。我不明白。例如,“从给定节点开始的根的第n个节点”。这是什么意思?哪根?你的样品有两个。它是,sql,oracle,query-optimization,hierarchy,Sql,Oracle,Query Optimization,Hierarchy,找到根了吗?我不明白你要的是什么-画简单的图表可能会有帮助。我猜最快的递归查询应该使用递归公共表表达式,因为这样一来,一旦到达第n个节点,CTE就可以停止遍历树了。我不明白。例如,“从给定节点开始的根的第n个节点”。这是什么意思?哪根?你的样品有两个。它是从根开始的第n个节点,还是从给定节点开始的第n个节点?等。请阅读你的问题,并诚实地看你是否能理解它自己。如果你不能,我们也不能。与此不同的是:你所有的树都是线性的吗(意思是,没有父母有一个以上的孩子)?“根”是什么?您的数据显示是在parent
找到根了吗?我不明白你要的是什么-画简单的图表可能会有帮助。我猜最快的递归查询应该使用递归公共表表达式,因为这样一来,一旦到达第n个节点,CTE就可以停止遍历树了。我不明白。例如,“从给定节点开始的根的第n个节点”。这是什么意思?哪根?你的样品有两个。它是从根开始的第n个节点,还是从给定节点开始的第n个节点?等。请阅读你的问题,并诚实地看你是否能理解它自己。如果你不能,我们也不能。与此不同的是:你所有的树都是线性的吗(意思是,没有父母有一个以上的孩子)?“根”是什么?您的数据显示是在
parent\u code
为NULL
时,但您的查询似乎没有检查任何NULL
值,也没有查找以root
开头的帐户,因此您如何知道您找到了root?我不理解您的要求-绘制简单的图表可能会有所帮助。我猜最快的递归查询应该使用递归公共表表达式,因为这样一来,一旦到达第n个节点,CTE就可以停止遍历树了。我不明白。例如,“从给定节点开始的根的第n个节点”。这是什么意思?哪根?你的样品有两个。它是从根开始的第n个节点,还是从给定节点开始的第n个节点?等。请阅读你的问题,并诚实地看你是否能理解它自己。如果你不能,我们也不能。与此不同的是:你所有的树都是线性的吗(也就是说,没有父母有一个以上的孩子)?
test_data
---------
unique_id | lookup_acct_code
'1' 'leaf-1'
'2' 'stem-2'
'3' 'branch-1'
'4' 'trunk-2'
'5' 'root-1'
linked_accounts
---------------
acct_code | parent_code
'leaf-1' 'stem-1'
'stem-1' 'twig-1'
'twig-1' 'stick-1'
'stick-1' 'branch-1'
'branch-1' 'trunk-1'
'trunk-1' 'root-1'
'root-1' NULL
'leaf-2' 'stem-2'
'stem-2' 'twig-2'
'twig-2' 'stick-2'
'stick-2' 'branch-2'
'branch-2' 'trunk-2'
'trunk-2' 'root-2'
'root-2' NULL
SELECT unique_id,
(SELECT acct_code
FROM (SELECT acct_code, ROW_NUMBER() OVER (ORDER BY level desc) rn
FROM linked_accounts
CONNECT BY acct_code = PRIOR parent_code
START WITH acct_code = lookup_acct_code)
WHERE rn <= 3
ORDER BY rn DESC
FETCH FIRST 1 ROWS ONLY)
FROM test_data;
/* Correct output
1 branch-1
2 branch-2
3 branch-1
4 trunk-2
5 root-1
*/
with hier as (
select
/*Find unique ID of subtree*/
connect_by_root(f.unique_id) as unique_id,
connect_by_root(la.acct_code) as start_node,
la.acct_code,
/*Find max depth of subtree*/
max(level) over(partition by connect_by_root(f.unique_id)) as max_lvl,
/*Find current reversed depth of node*/
level as lvl
from linked_accounts la
left join test_data f
on la.acct_code = f.lookup_acct_code
start with f.unique_id is not null
connect by prior la.parent_code = la.acct_code
)
select
unique_id,
case max_lvl
when lvl
/*Select our start node for short subtree*/
then start_node
/*And node al level 3 otherwise*/
else acct_code
end as node_name
from hier
/*Select the node on level 3 from the root*/
where max_lvl - lvl = 2
/*Or the last node in subtree for the depth < 3*/
or (max_lvl <= 2 and lvl = max_lvl)
order by 1 asc
UNIQUE_ID | NODE_NAME
:-------- | :--------
1 | branch-1
2 | branch-2
3 | branch-1
4 | trunk-2
5 | root-1
UNIQUE_ID | NTH_FROM_ROOT
:-------- | :------------
1 | branch-1
2 | branch-2
3 | branch-1
4 | trunk-2
5 | root-1