【问题标题】:How to delete results using recursive common table expression?如何使用递归公用表表达式删除结果?
【发布时间】:2019-12-07 15:12:55
【问题描述】:

我想使用公用表表达式从 sql 中的树结构中删除所有子项,但我似乎无法使其正常工作。这是我的表现在的样子,它只是引用同一个表的两个外键。这是reply

| parent_id | child_id  |
|-----------|-----------|
| 1         | 60        |
| 2         | 70        |
| 70        | 80        |

post 表是这样的

    | id        | text                 |
    |-----------|----------------------|
    | 1         | "blah blah"          |
    | 2         | "the quick brown fox |
    | 70        | "more text"          |

回复表指的是post表id

为了使用它,我目前选择了一个根节点的子节点。例如,如果根节点是 1,那么我会检索帖子 60。如果根节点是 2,那么我会检索 70 和 80。我会得到 80,因为它是 70 的子节点,而 70 是子节点2 个。

为此,我使用以下查询:

WITH recursive cte (parent_id, child_id, text) AS 
( 
           SELECT     reply.parent_id, 
                      child_id, 
                      post.text 
           FROM       reply 
           INNER JOIN post 
           ON         reply.child_id = post.id 
           WHERE      parent_id = ? 
           UNION ALL 
           SELECT     p.parent_id, 
                      p.child_id, 
                      post.text 
           FROM       reply p 
           INNER JOIN post 
           ON         p.child_id = post.id 
           INNER JOIN cte 
           ON         p.parent_id = cte.child_id )
SELECT * 
FROM   cte

最终,我只想递归删除所有结果,所以我尝试了这个但没有成功。

WITH recursive cte (parent_id, child_id, text) AS 
( 
           SELECT     reply.parent_id, 
                      child_id, 
                      post.text 
           FROM       reply 
           INNER JOIN post 
           ON         reply.child_id = post.id 
           WHERE      parent_id = ? 
           UNION ALL 
           SELECT     p.parent_id, 
                      p.child_id, 
                      post.text 
           FROM       reply p 
           INNER JOIN post 
           ON         p.child_id = post.id 
           INNER JOIN cte 
           ON         p.parent_id = cte.child_id ) 
DELETE a 
FROM       reply a 
INNER JOIN cte b 
ON         a.parent_id = b.parent_id 
AND        a.child_id = b.child_id

如何使用 cte 中的结果删除原始回复表中的条目?我应该可以使用带有 with 关键字的 delete 语句,但它似乎不起作用。

编辑没关系。我正在使用 MariaDB,但它不起作用。当我在 MySQL 上尝试它时,它就像一个魅力。也许其他人将来会遇到同样的问题,或者到那时它会得到解决。

【问题讨论】:

标签: mysql sql database recursion common-table-expression


【解决方案1】:

从 MariaDB 切换到 MySQL 解决了我的问题。谢谢大家。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-24
    • 1970-01-01
    相关资源
    最近更新 更多