如何使用递归公用表表达式删除结果?

时间:2019-07-30 09:08:16

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

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

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

帖子表看起来像这样

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

回复表引用发布表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内的结果删除原始回复表中的条目?我应该可以将delete语句与with关键字一起使用,但是它似乎不起作用。

EDITL没关系。我正在使用MariaDB,但无法正常工作。当我在MySQL上尝试它时,它就像一种魅力。也许将来会有其他人遇到同样的问题,或者也许到那时才能解决。

1 个答案:

答案 0 :(得分:0)

从MariaDB切换到MySQL修复了我的问题。谢谢大家。