1

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

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

有任何想法吗?

谢谢

4

2 回答 2

1
  1. 枚举同一级别的节点

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

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

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

于 2014-07-22T23:10:17.990 回答
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
于 2014-07-23T03:04:40.667 回答