Oracle SQL Hierarchical查询自下而上

时间:2014-03-12 09:30:11

标签: sql oracle hierarchical

我有叶子的ids。我需要在层次结构中选择所有id。现在我正在使用以下查询:

select distinct id 
from table
start with id in (IDS_OF_LEAFS)
connect by id = prior pid

但是,如果没有明确的遍历完整层次结构,它可能会以另一种方式完成吗?

2 个答案:

答案 0 :(得分:0)

不,如果没有其他内容,例如为每一行添加自定义索引值,然后以数学方式计算要选择的内容,则无法实现。但它不是原生的,而且是非常重的解决方案。如果您不知道树的高度,则无法替换此查询,并且您需要手动编写select语句的数量等于树的高度。

如果您遇到性能问题,请创建索引或物化视图,这些视图将收集每个假期的所有父母。

答案 1 :(得分:0)

正如另一个答案中所提到的,如果您不知道树的高度并且不必费心编写一系列手动选择,那么您必须支付不同的全树遍历。但是我怀疑开销很大,因为在自下而上的层次结构中,每个级别只有一个父节点(如果你的层次结构没有循环和多重继承)。要估算唯一/总ID的比率,我们将平均树高度h和列表中的叶子数量设为q。如果所有叶子具有不同的父项,则查询输出为最大h * q行。理论上可以获得的最小行数是h + q - 1(当列表中的所有叶子具有相同的父项时)。所以(h + q - 1) / (h * q)是最坏情况的不同记录和总记录之间的比率。您可以替换hq的实际值来衡量不同操作的可能开销。如您所见,我们不会考虑表中的总行数。我假设父和子id列有一个索引,所以每个搜索操作都会表现良好。