我有叶子的ids。我需要在层次结构中选择所有id。现在我正在使用以下查询:
select distinct id
from table
start with id in (IDS_OF_LEAFS)
connect by id = prior pid
但是,如果没有明确的遍历完整层次结构,它可能会以另一种方式完成吗?
答案 0 :(得分:0)
不,如果没有其他内容,例如为每一行添加自定义索引值,然后以数学方式计算要选择的内容,则无法实现。但它不是原生的,而且是非常重的解决方案。如果您不知道树的高度,则无法替换此查询,并且您需要手动编写select
语句的数量等于树的高度。
如果您遇到性能问题,请创建索引或物化视图,这些视图将收集每个假期的所有父母。
答案 1 :(得分:0)
正如另一个答案中所提到的,如果您不知道树的高度并且不必费心编写一系列手动选择,那么您必须支付不同的全树遍历。但是我怀疑开销很大,因为在自下而上的层次结构中,每个级别只有一个父节点(如果你的层次结构没有循环和多重继承)。要估算唯一/总ID的比率,我们将平均树高度h
和列表中的叶子数量设为q
。如果所有叶子具有不同的父项,则查询输出为最大h * q
行。理论上可以获得的最小行数是h + q - 1
(当列表中的所有叶子具有相同的父项时)。所以(h + q - 1) / (h * q)
是最坏情况的不同记录和总记录之间的比率。您可以替换h
和q
的实际值来衡量不同操作的可能开销。如您所见,我们不会考虑表中的总行数。我假设父和子id列有一个索引,所以每个搜索操作都会表现良好。