在postgresql中创建父项或父项集的所有子项的表

时间:2014-11-21 23:25:41

标签: sql postgresql

我有一个父子关系表,并希望生成一个包含给定父母或父母的所有子女的表。

顺便说一下,我不知道如何创建堆栈溢出降价的表格,我试过并失败了。

示例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,我可以运行一个独特的。

我提出了一个想法,但我不知道从哪里开始,我到处寻找这个。 谢谢你的帮助。

1 个答案:

答案 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