Postgres查询以获取所有子ID

时间:2018-05-31 06:12:10

标签: sql postgresql recursive-query

我是一个SQL菜鸟,到目前为止只编写了非常基本的查询。

我有一张看起来像这样的表

item_full_name      varchar(65535)
item_id             bigint
item_owners         varchar(255)
item_approver_group varchar(255)
item_state          varchar(255)
item_parent_id      bigint
item_children       varchar(65535)

最初,item_children对于所有行都是空的,但每个项目都有一个item_parent_id且不为null。我想编写一个查看所有行和查询的查询。相应的父ID并使用逗号分隔的一行子ID更新每一行的item_children。

例如。

item_full_name | item_id | item_owners | item_parent_id | item_children
item1          | 1       | o1, o2      | 2              | 
item2          | 3       | owner8      | 2              |
item3          | 2       | owner6      | 0              |
item4          | 4       | owner7      | 1              |

这应该转换为

item_full_name | item_id | item_owners | item_parent_id | item_children
item1          | 1       | o1, o2      | 2              | 4
item2          | 3       | owner8      | 2              |
item3          | 2       | owner6      | 0              | 3,1
item4          | 4       | owner7      | 1              |

任何指针都会有所帮助。谢谢!

1 个答案:

答案 0 :(得分:1)

我开始走上递归CTE的道路,但后来意识到你只想要每个父母的孩子,在那个单一的水平。一种方法是将item_id汇总到item_parent_id。然后,将原始表格连接到此结果,以获取每个父项的子项的CSV列表。

WITH cte AS (
    SELECT item_parent_id, STRING_AGG(item_id::text, ',') AS item_children
    FROM yourTable
    GROUP BY item_parent_id
)

SELECT
    t1.item_full_name,
    t1.item_id,
    t1.item_owners,
    t1.item_parent_id,
    t2.item_children
FROM yourTable t1
LEFT JOIN cte t2
    ON t1.item_id = t2.item_parent_id
ORDER BY
    t1.item_full_name;

enter image description here

Demo