我正在尝试编写一个分层的Oracle 11g查询,该查询将从顶层到最后一层的层次结构中选择所有节点。对于最后一级或叶节点,查询应该只选择一个随机节点,因此,不是每个倒数第二个节点的所有叶节点。因此,如果第二个最后一个节点有三个子节点,则查询应该只选择其中一个没有首选项。
我可以通过connect by子句选择整个层次结构,但我发现很难将叶节点的选择限制为每个倒数第二个节点只有一个节点。
有什么想法吗?
由于
答案 0 :(得分:1)
枚举同一级别的节点
row_number()over(按级别顺序分区)
在外部查询中包装该查询
只选择第一片叶子(不要忘记包括所有中间元素)
答案 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