Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
删除sql或javascript循环中的层次结构行_Javascript_Sql_Node.js_Postgresql_Loops - Fatal编程技术网

删除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

我正在使用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_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