递归删除一个表中的多行

问题描述 投票:1回答:1

我的postgres数据库有问题。我有一个包含三列的表Tasks:ID,名称和Parent_ID(引用此表中的另一个任务ID):

id | name | parent_id 
---+------+-----------
 1 | A    |     0
 2 | B    |     1
 3 | C    |     2
 4 | D    |     1
 5 | E    |     0
 6 | F    |     0

所以基本上就是这样:

1. A
2.     B
3.          C
4.     D
5. E
6. F  

[我要做的是删除任务A,并删除其所有子代以及所有子代的子代等等。(在这种情况下,B和D,以及C为其删除的B子代)像级联删除,但我不能做到这一点。也许任何功能都可以工作?

删除后的结果应为

id | name | parent_id
---+------+-----------
 5 | E    |     0
 6 | F    |     0

希望你们能帮助我。

sql postgresql sql-delete hierarchical-query
1个回答
1
投票

您可以使用递归查询从起始名称构建所有后代行的列表,然后将其用作删除的过滤器。

with recursive cte(id, parent_id) as (
    select id, parent_id from mytable where name = 'A'
    union all
    select t.id, t.parent_id from mytable t inner join cte c on c.id = t.parent_id
)
delete from mytable where id in (select id from cte)

Demo on DB Fiddle-执行查询后的表内容:

id |名称| parent_id-:| :--- | --------:5 | E | 06 | F | 0
© www.soinside.com 2019 - 2024. All rights reserved.