【发布时间】:2021-05-31 11:25:15
【问题描述】:
我正在尝试从给定节点开始从根中查找第 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
*/
【问题讨论】:
-
什么是“根”?您的数据表明这是
parent_code是NULL但您的查询似乎没有检查任何NULL值,也没有寻找以root开头的帐户,那么您怎么知道您找到了根? -
我无法理解您的要求 - 它可能有助于绘制简单的图表。我猜想最快的递归查询将使用递归公用表表达式,因为这样 CTE 可以在到达第 N 个节点时停止遍历树。
-
我不明白。例如“从给定节点开始的根节点的第 N 个节点”。那是什么意思? 哪个根?您的样本有两个。它是从根开始的第 N 个,还是从给定节点开始的第 N 个?等等。请阅读您的问题并 - 老实说 - 看看您自己是否能理解。如果你不能,我们也不能。另外:你所有的树都是linear(意思是,没有父母有超过一个孩子)吗?
标签: sql oracle query-optimization hierarchy