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
我有一个非常复杂的 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 tablemap_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