我有一个表名树,它有两列,一列是p,第二列是ch。
p ch
-------------
1 2
1 3
1 4
2 5
2 6
7 8
9 10
11 12
6 13
13 14
14 15
14 16
我想要的输出是所有链接到父母的孩子。例如,如果我给“1”作为输入,我必须找到所有父元素和子元素,在这种情况下,1 是 2、3、4 的父元素,2 是 5 的父元素,依此类推......在这种情况下,我需要每个链接的子元素和父元素本身,如下所述:
ParentChilds
------------
1
2
3
4
5
6
13
14
15
16
下面是我写的查询,我想确认它是最好的解决方案,或者我们可以做得更好,因为我的表中有大量数据:
with LinkedAccounts (p, ch, orig_recur, dest_recur, lvl) as (
select n.p
, n.ch
, 1 orig_recur
, case n.p
when 1 then ch
else p
end dest_recur
, 1 lvl
from tree n
where n.p = 1
or n.ch = 1 union all
select n.p
, n.ch
, LinkedAccounts.dest_recur orig_recur
, case n.p
when LinkedAccounts.dest_recur then n.ch
else n.p
end dest_recur
, LinkedAccounts.lvl + 1 lvl
from LinkedAccounts
join tree n
on (n.p = LinkedAccounts.dest_recur and n.ch != LinkedAccounts.orig_recur)
or (n.ch = LinkedAccounts.dest_recur and n.p != LinkedAccounts.orig_recur)
)
search breadth first by orig_recur, dest_recur set ordering
cycle ch,
p set is_cycle to '1' default '0' select distinct p from LinkedAccounts union Select Distinct ch from LinkedAccounts;