delete/select postgresql 中的层次结构数据
delete/select hierarchy data in postgresql
我有 table comment
,我想通过输入 id
删除并删除所有子项,
下面两个查询都没有删除所有层次结构数据,只删除自身和一个子行...
在with
闭包中select递归有什么问题吗?
评论
id | parent_comment_id
1 |
2 | 1
3 | 2
4 |
查询 1
WITH RECURSIVE coH AS (
SELECT co.id,
co.id AS rootId
FROM comment co
UNION ALL
SELECT coChild.id,
coChild.parent_comment_id as parentCommentId
FROM comment coChild
JOIN coH coP ON coP.id = coChild.parent_comment_id
)
DELETE FROM comment WHERE id IN (
SELECT id FROM coH WHERE rootId =
)
查询 2
DELETE FROM comment WHERE id IN (
WITH RECURSIVE coH AS (
SELECT co.id,
co.id AS rootId
FROM comment co
UNION ALL
SELECT coChild.id,
coChild.parent_comment_id as parentCommentId
FROM comment coChild
JOIN coH coP ON coP.id = coChild.parent_comment_id
)
SELECT id FROM coH WHERE rootId =
)
更新
var dbQuery = `DELETE FROM comment WHERE id IN (
WITH RECURSIVE coH (id, parentCommentId, rootId) AS (
SELECT co.id,
co.parent_comment_id as parentCommentId,
co.id AS rootId
FROM comment co
UNION ALL
SELECT coChild.id,
coChild.parent_comment_id as parentCommentId,
coP.rootId
FROM comment coChild
JOIN coH coP ON coP.id = coChild.parent_comment_id
)
SELECT id FROM coH WHERE rootId =
)`;
保持简单,将参数放在递归的初始查询中:
with recursive cbase as (
select 1 as id -- select as id
union all
select child.id
from comment as child
join cbase on cbase.id = child.parent_comment_id
)
delete from comment
where id in (select * from cbase)
returning id;
id
----
1
2
3
(3 rows)
DELETE 3
我有 table comment
,我想通过输入 id
删除并删除所有子项,
下面两个查询都没有删除所有层次结构数据,只删除自身和一个子行...
在with
闭包中select递归有什么问题吗?
评论
id | parent_comment_id
1 |
2 | 1
3 | 2
4 |
查询 1
WITH RECURSIVE coH AS (
SELECT co.id,
co.id AS rootId
FROM comment co
UNION ALL
SELECT coChild.id,
coChild.parent_comment_id as parentCommentId
FROM comment coChild
JOIN coH coP ON coP.id = coChild.parent_comment_id
)
DELETE FROM comment WHERE id IN (
SELECT id FROM coH WHERE rootId =
)
查询 2
DELETE FROM comment WHERE id IN (
WITH RECURSIVE coH AS (
SELECT co.id,
co.id AS rootId
FROM comment co
UNION ALL
SELECT coChild.id,
coChild.parent_comment_id as parentCommentId
FROM comment coChild
JOIN coH coP ON coP.id = coChild.parent_comment_id
)
SELECT id FROM coH WHERE rootId =
)
更新
var dbQuery = `DELETE FROM comment WHERE id IN (
WITH RECURSIVE coH (id, parentCommentId, rootId) AS (
SELECT co.id,
co.parent_comment_id as parentCommentId,
co.id AS rootId
FROM comment co
UNION ALL
SELECT coChild.id,
coChild.parent_comment_id as parentCommentId,
coP.rootId
FROM comment coChild
JOIN coH coP ON coP.id = coChild.parent_comment_id
)
SELECT id FROM coH WHERE rootId =
)`;
保持简单,将参数放在递归的初始查询中:
with recursive cbase as (
select 1 as id -- select as id
union all
select child.id
from comment as child
join cbase on cbase.id = child.parent_comment_id
)
delete from comment
where id in (select * from cbase)
returning id;
id
----
1
2
3
(3 rows)
DELETE 3