SQL 复杂的递归查询 table

SQL recursive query for complex table

我有一个非常复杂的 table 结构,具有 parent-child 关系。 该结构背后的想法是 child_id 中的某些 object 可以触发 parent_id。 假设这个数据;

Table 1 - 地图

map_id | parent_id | child_id
1      | 1         | 2
2      | 1         | 3
3      | 1         | 4

Table 2 - 属性

attribute_id | child_id | id_to_trigger
1            | 2        | 5
2            | 5        | 6

例子:一个问卷系统是高手。它可以包含要回答的子组;在这种情况下,子组成为主组的 child。子组中的某些答案可以触发其中的其他子组。

我希望现在能够获取给定主控的所有子组 ID。一个子组可以从多个子组触发,但这不是问题,因为我只需要子组 ID。

可以看出,id为1的master有3个sub group 2,3,4。在属性table中可以看到sub group 2可以触发sub group 5;同样5可以触发6等等。

我的输出需要 2、3、4、5、6。我该如何实现?

考虑一下您的设计,如果您将这 2 个记录添加到您的 table 1

,我建议您不需要 2 table
map_id | parent_id | child_id
1      | 1         | 2
2      | 1         | 3
3      | 1         | 4
4      | 2         | 5
5      | 5         | 6

您现在可以使用标准 CTE 遍历树

像这样

with Tree as (select child_id from table_1 where parent_id = 1
union all 
select table_1.child_id from table_1 
inner join Tree on Tree.child_id = table_1.parent_id)

select * from Tree

如果您不能更改模式,这将起作用

with 
table_1 as ( select Parent_id , child_id from map
                union all
                select child_id as Parent_id, id_to_trigger as child_id from attributes)
,Tree as (select child_id from table_1 where parent_id = 1
union all 
select table_1.child_id from table_1 
inner join Tree on Tree.child_id = table_1.parent_id)

select * from Tree

试试这个:

SELECT     
    map.parent_id, 
    map.child_id 
    FROM
    map 

    UNION

        SELECT     
        attributes.child_id, 
        attributes.id_to_trigger
        FROM
        map 
        Inner JOIN attributes ON map.child_id = attributes.child_id

    UNION

        SELECT  
        T1.child_id, 
        T1.id_to_trigger   
        FROM
        attributes T1 
        Inner JOIN attributes T2 ON T1.child_id = T2.id_to_trigger

结果:

parent_id | child_id
1         | 2         
1         | 3         
1         | 4         
2         | 5         
5         | 6