我有一个父子关系表,并希望生成一个包含给定父母或父母的所有子女的表。
顺便说一下,我不知道如何创建堆栈溢出降价的表格,我试过并失败了。
示例1:
表名:关系
Child_ID Parent_ID
1 2
2 3
3 4
4 5
5 6
6 7
7 8
8 9
9 10
10 11
因此,对于Parent_ID 7,结果表应为:
Child_ID Parent_ID
1 7
2 7
3 7
4 7
5 7
6 7
或者,也许使用表格,选择所有孩子:
加入以下父母表:
Parent_ID
7
9
产生如下结果:
Child_ID Parent_ID
1 7
2 7
3 7
4 7
5 7
6 7
1 9
2 9
3 9
4 9
5 9
6 9
7 9
8 9
...当然,如果我想要独特的Child_ID,我可以运行一个独特的。
我提出了一个想法,但我不知道从哪里开始,我到处寻找这个。 谢谢你的帮助。
答案 0 :(得分:0)
您可以RECURSIVE
CTE。使用数组函数创建关系列表。
创建数据
SELECT child_id, parent_id
INTO temp table relations
FROM (VALUES (1, 2),
(2, 3),
(3, 4),
(4, 5),
(5, 6),
(6, 7),
(7, 8),
(8, 9),
(9, 10),
(10, 11) ) as t(child_id, parent_id)
接下来是递归CTE,我们将从上表中的初始关系开始,然后通过将子项连接到父项继续添加行(UNION
):
WITH recursive children(child_id, parent_id) AS(
SELECT child_id, parent_id
FROM relations
UNION
SELECT relations.child_id, children.parent_id
FROM children
INNER JOIN relations ON relations.parent_id = children.child_id
-- SELECT chain_.parent_id, child_id || children
-- FROM chain_
-- INNER JOIN relations ON relations.parent_id = children[1]
)
SELECT * FROM children where parent_id = 7
产生结果:
child_id | parent_id
---------+----------
6 | 7
5 | 7
4 | 7
3 | 7
2 | 7
1 | 7