递归SQL论坛帖子,回复回复

时间:2012-08-06 12:49:36

标签: sql-server sql-server-2008

我真的很想找到一种合适的方法来在SQL 2008中提取所有主题回复(以及回复回复)。

这是数据库结构。

Forum_Cats

catID    |    CatName
1        |    Q&A
2        |    General Discussion

Forum_Topics

topicID  |   catID   |   ReplyTo   |   TopicTitle                      
1        |   1       |   null      |   Just wondering if anyone knows?
2        |   1       |   1         |   Yeah I know that.
3        |   1       |   2         |   Thanks

那么我需要一个函数,我可以传递一个topicID并生成所有回复子项吗?

E.g。我传递topicID 1并返回第2行和第3行,因为2是1的答复,3是2的答复。

2 个答案:

答案 0 :(得分:0)

您需要实现递归CTE。这是一个很好的例子,可以完全按照你想要做的去做。

Recursive Queries Using Common Table Expressions

如果我有时间并且您需要帮助,我会改进示例以适应您的桌面结构,但它非常直接。但我很容易看到这超过了MAXRECURSION级别。更好的方法可能是添加一列来跟踪每个回复中的顶级主题,然后按ReplyTo排序。

答案 1 :(得分:0)

只要您注意确保回复的数量不超过MAXRECURSION级别,您就可以使用CTE

;WITH topic (topicId, catId, replyTo, topicTitle) AS (
    SELECT topicId, catId, replyTo, topicTitle
    FROM Forum_Topics F
    WHERE F.topicId = @topicId

    UNION ALL

    SELECT topicId, catId, replyTo, topicTitle
    FROM Forum_Topics F
    INNER JOIN topic T ON T.topicId = F.replyTo
)
SELECT * FROM topic