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