如何从具有最低级别的分层查询中选择行?

All*_*wis 6 oracle oracle-11g-r2

我在 Oracle 11gR2 中有一个分层查询,它返回如下内容:

  • 家长(级别 1)
    • 儿童(2级)
      • 孙子(3级)
    • 儿童(2级)
      • 孙子(3级)
      • 孙子(3级)
    • 儿童(2级)

我想编写的查询应该获取与某个谓词匹配的所有行,对于最低级别;即最接近父母。例如,如果其中一个子行与谓词匹配,则它应该只返回该行,而不管是否有任何孙子行匹配。如果多个子行匹配,它应该返回所有子行,同样不管孙行。如果没有子行匹配,它应该返回任何匹配的孙行,等等(在实际系统中,我有不止三个级别,每个级别还有更多行。)

我认为这可以通过分析函数实现,但我不确定使用哪个,或者如何将它集成到我的查询中。我已经看到使用 解决了类似的问题min (level) keep (dense_rank last order by level),但这似乎并不是我想要的。

ype*_*eᵀᴹ 3

如果您有一个在根节点下生成整个树的分层查询,并且还level计算了一列,则可以将其包装在派生表或 cte 中并使用窗口聚合:

WITH query AS
  ( SELECT <columns list>, level
  -- your query here
  ) ,
cte AS 
  ( SELECT <columns list>, level,
           MIN(the_level) OVER () AS min_level
    FROM query
    WHERE <conditions>
  )
SELECT *
FROM cte
WHERE min_level = level ;
Run Code Online (Sandbox Code Playgroud)