有向图/层次结构SQl

问题描述 投票:0回答:1

我们有来自上游的以下数据:-

child. Parent
2.      1
3.      1
14.     1
1.      4
5.      1
6.      7
8.      7
13.     8
12.     8
8.      13
9.      10
10.     11

有时,孩子出现在父母中,反之亦然,没有固定的顺序,关系也可以是循环的。

预期的输出是

child.  group
1.       1
2.       1
3.       1
4.       1
5.       1
6.       1
7.       1
8.       1
12.      1
13.      1

9.       10
10.      10
11.      10

有人可以提出可能的解决方案,我已经尝试过定向sql,但是循环关系被排除在外

请提出建议

sql teradata hierarchical-data directed-graph
1个回答
0
投票

周期让这很痛苦。一种方法是将已访问的值存储在字符串中。因此,我们的想法是获取每个可能的匹配值,然后进行汇总-最小匹配是“组”的良好描述符:

with recursive cp as (
      select child as node1, child as node2
      from t
      union  -- remove duplicates
      select parent, parent
      from t
     ),
     cte as (
      select node1, node2, '|' || node1 || '|' as nodes
      from cp
      union all
      select cte.node1, cp.node2, cte.nodes || cte.node1 || '|'
      from cte join
           cp
           on cp.node2 = cte.node1
      where cte.nodes not like '%|' || cp.node1 || '|%'
     )
select cte.node1, min(cte.node2)
from cte
group by cte.node1;
© www.soinside.com 2019 - 2024. All rights reserved.