Oracle分层选择性查询

时间:2014-07-22 22:30:53

标签: sql oracle hierarchical connect-by

我正在尝试编写一个分层的Oracle 11g查询,该查询将从顶层到最后一层的层次结构中选择所有节点。对于最后一级或叶节点,查询应该只选择一个随机节点,因此,不是每个倒数第二个节点的所有叶节点。因此,如果第二个最后一个节点有三个子节点,则查询应该只选择其中一个没有首选项。

我可以通过connect by子句选择整个层次结构,但我发现很难将叶节点的选择限制为每个倒数第二个节点只有一个节点。

有什么想法吗?

由于

2 个答案:

答案 0 :(得分:1)

  1. 枚举同一级别的节点

    row_number()over(按级别顺序分区)

  2. 在外部查询中包装该查询

    只选择第一片叶子(不要忘记包括所有中间元素)

答案 1 :(得分:0)

您可以在11g中使用新的递归子查询因子功能,例如:

WITH e(owner,NAME,lv,seq) AS
 (SELECT 'SYS' owner, 'OBJ$' NAME, 1 lv, 1 seq
  FROM   dual
  UNION ALL
  SELECT a.owner,
         a.NAME,
         lv + 1,
         row_number() OVER(PARTITION BY e.name, e.owner ORDER BY 1)
  FROM   dba_dependencies a, e
  WHERE  referenced_name = e.name
  AND    referenced_owner = e.owner
  AND    e.seq = 1)
SELECT * FROM e WHERE seq = 1

或者:

WITH e(owner,NAME,lv,seq) AS
 (SELECT 'SYS' owner, 'OBJ$' NAME, 1 lv, 1 seq
  FROM   dual
  UNION ALL
  SELECT a.owner, a.NAME, lv + 1,a.seq  
  FROM   (SELECT a.*,
                 row_number() OVER(PARTITION BY referenced_name, referenced_owner ORDER BY 1) seq
          FROM   dba_dependencies a) a,
         e
  WHERE  referenced_name = e.name
  AND    referenced_owner = e.owner
  AND    a.seq = 1)
SELECT * FROM e