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