删除sql或javascript循环中的层次结构行
我正在使用postgresql,我想找到一种递归删除行和属于它的子行的方法。sql或javascript循环删除sql或javascript循环中的层次结构行,javascript,sql,node.js,postgresql,loops,Javascript,Sql,Node.js,Postgresql,Loops,我正在使用postgresql,我想找到一种递归删除行和属于它的子行的方法。sql或javascript循环 e、 g 如果要删除TagId:0,还需要删除TagId:0、2、3、4、5,查找其他行ParentTagId中的TagId,然后递归查找其他行 我只在下面写了一部分代码,我不知道如何循环保持选择和删除 "TagId" serial NOT NULL, "Name" character varying, "ParentTagId" integer, CONSTRAINT "Tag_pke
e、 g
如果要删除
TagId:0
,还需要删除TagId:0、2、3、4、5
,查找其他行ParentTagId
中的TagId
,然后递归查找其他行
我只在下面写了一部分代码,我不知道如何循环保持选择和删除
"TagId" serial NOT NULL,
"Name" character varying,
"ParentTagId" integer,
CONSTRAINT "Tag_pkey" PRIMARY KEY ("TagId")
TagId | Name | ParentTagId
0 | |
1 | |
2 | |0
3 | |2
4 | |3
5 | |0
-
Sql解决方案。 此递归查询为所有
TagId
s选择子ID数组(如children
):
with recursive "Tags"("TagId", "ChildId", "Children") as (
select "TagId", "TagId", array["TagId"]
from "Tag"
union
select "Tags"."TagId", "Tag"."TagId", "Tags"."Children"|| "Tag"."TagId"
from "Tags"
join "Tag" on "Tags"."ChildId" = "Tag"."ParentTagId"
),
"Children" as (
select "TagId", unnest("Children")
from "Tags"
)
select "TagId", array_agg(distinct unnest) "Children"
from "Children"
group by 1
order by 1;
TagId | Children
-------+-------------
0 | {0,2,3,4,5}
1 | {1}
2 | {2,3,4}
3 | {3,4}
4 | {4}
5 | {5}
(6 rows)
所以这一个为TagId=0
选择子项:
with recursive "Tags"("TagId", "ChildId", "Children") as (
select "TagId", "TagId", array["TagId"]
from "Tag"
union
select "Tags"."TagId", "Tag"."TagId", "Tags"."Children"|| "Tag"."TagId"
from "Tags"
join "Tag" on "Tags"."ChildId" = "Tag"."ParentTagId"
),
"Children" as (
select "TagId", unnest("Children")
from "Tags"
)
select array_agg(distinct unnest) "Children"
from "Children"
where "TagId" = 0
Children
-------------
{0,2,3,4,5}
(1 row)
最后,此查询删除TagId=0
及其所有子项:
with recursive "Tags"("TagId", "ChildId", "Children") as (
select "TagId", "TagId", array["TagId"]
from "Tag"
union
select "Tags"."TagId", "Tag"."TagId", "Tags"."Children"|| "Tag"."TagId"
from "Tags"
join "Tag" on "Tags"."ChildId" = "Tag"."ParentTagId"
),
"Children" as (
select "TagId", unnest("Children")
from "Tags"
)
delete from "Tag"
where "TagId" in (
select distinct unnest
from "Children"
where "TagId" = 0
)
returning *;
TagId | Name | ParentTagId
-------+------+-------------
2 | | 0
0 | |
4 | | 3
3 | | 2
5 | | 0
(5 rows)
DELETE 5
with recursive "Tags"("TagId", "ChildId", "Children") as (
select "TagId", "TagId", array["TagId"]
from "Tag"
union
select "Tags"."TagId", "Tag"."TagId", "Tags"."Children"|| "Tag"."TagId"
from "Tags"
join "Tag" on "Tags"."ChildId" = "Tag"."ParentTagId"
),
"Children" as (
select "TagId", unnest("Children")
from "Tags"
)
select array_agg(distinct unnest) "Children"
from "Children"
where "TagId" = 0
Children
-------------
{0,2,3,4,5}
(1 row)
with recursive "Tags"("TagId", "ChildId", "Children") as (
select "TagId", "TagId", array["TagId"]
from "Tag"
union
select "Tags"."TagId", "Tag"."TagId", "Tags"."Children"|| "Tag"."TagId"
from "Tags"
join "Tag" on "Tags"."ChildId" = "Tag"."ParentTagId"
),
"Children" as (
select "TagId", unnest("Children")
from "Tags"
)
delete from "Tag"
where "TagId" in (
select distinct unnest
from "Children"
where "TagId" = 0
)
returning *;
TagId | Name | ParentTagId
-------+------+-------------
2 | | 0
0 | |
4 | | 3
3 | | 2
5 | | 0
(5 rows)
DELETE 5