Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 找到根了吗?我不明白你要的是什么-画简单的图表可能会有帮助。我猜最快的递归查询应该使用递归公共表表达式,因为这样一来,一旦到达第n个节点,CTE就可以停止遍历树了。我不明白。例如,“从给定节点开始的根的第n个节点”。这是什么意思?哪根?你的样品有两个。它是_Sql_Oracle_Query Optimization_Hierarchy - Fatal编程技术网

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