我有一张名为" test"的表。它包含父列和子列。
Parent Child
1 101
1 102
1 103
101 121
101 123
103 133
121 80
121 81
现在,我写了一个查询,它给我带来了给定的所有孩子/父母" 1"值。
( SELECT parent,child,LEVEL FROM TEST
START WITH child= 1
CONNECT BY PRIOR parent=child)
UNION ALL
(SELECT parent,child,LEVEL FROM TEST
START WITH parent=1
CONNECT BY PRIOR child=parent)
ORDER BY parent
但是我想要那个等级中的所有孩子/父母,无论给出什么价值......。如果我给#34; 80" ....,我必须获取最高的父母价值(在这种情况下" 1")然后搜索下面那个最高父母值的所有孩子。
答案 0 :(得分:2)
您可以使用递归查询和伪列CONNECT_BY_ISLEAF来查找节点的最终祖先:
SELECT parent AS ancestor
FROM X
WHERE CONNECT_BY_ISLEAF <> 0
START WITH child=80
CONNECT BY PRIOR parent=child
-- ^^^^^^^^^^^^^^^^^^
-- ascendant order
一旦你拥有了#34;终极祖先&#34;,第二个递归查询将获得该节点的所有后代:
SELECT child AS descendant, LEVEL
FROM X
START WITH parent=1
CONNECT BY PRIOR child=parent
-- ^^^^^^^^^^^^^^^^^^
-- descendant order
请注意LEVEL
伪列,让您了解&#34;距离&#34;在一个节点和它的最终祖先之间。
全部放在一起:
SELECT child AS descendant, LEVEL
FROM X
START WITH parent IN (
SELECT parent AS ancestor
FROM X
WHERE CONNECT_BY_ISLEAF <> 0
START WITH child=80
CONNECT BY PRIOR parent=child
)
CONNECT BY PRIOR child=parent
根据您的样本数据制作:
DESCENDANT LEVEL
101 1
121 2
80 3
81 3
123 2
102 1
103 1
133 2