【问题标题】:SQL Parent/Child CTE OrderingSQL 父/子 CTE 排序
【发布时间】:2013-02-22 15:47:59
【问题描述】:

我正在尝试创建一个论坛设置,您可以在其中评论特定帖子并让回复按日期顺序显示在父级下方。在父级之下只会有一个子级。这是示例数据集:

ID.ParentID.Datestamp
12.NULL.2013-03-01 1:00pm
13.NULL.2013-03-01 2:00pm
14.12.2013-03-01 2:20pm
15.12.2013-03-01 2:30pm
16.NULL.2013-03-01 3:30pm

这就是我想要得到的结果:

12.NULL.2013-03-01 1:00pm
14.12.2013-03-01 2:20pm
15.12.2013-03-01 2:30pm
13.NULL.2013-03-01 2:00pm
16.NULL.2013-03-01 3:30pm

我知道我需要进行某种 CTE,但这不会将孩子排序在适当的父级下(显然,因为没有 ORDER BY 子句);我无法弄清楚正确的顺序。谁能提供一些见解?

; WITH Messages
AS 
(
    SELECT ID, ParentID, Datestamp
    FROM ForumMessages
    WHERE ParentID IS NULL

    -- Recursive
    UNION ALL 
    SELECT
        t2.ID, t2.ParentID, t2.Datestamp
    FROM
        ForumMessages AS t2
        JOIN Messages AS m ON t2.ParentID = m.ID
)

SELECT ID, ParentID, Datestamp
FROM Messages

【问题讨论】:

  • 您的最终陈述是从 CTE 生成的集合中简单选择的。它没有 ORDER BY 子句。
  • 是的。我尝试了一些东西,但无法弄清楚正确的顺序。你有答案吗?
  • 另外,在您描述的(论坛)等真实应用程序中,您不会对数据库中的所有内容进行排序;相反,您会等到用户单击特定的论坛消息,然后才检索其相关的子帖子,您可以按 datetime-posted 排序。
  • 此外,子帖子可以有子子帖子。带有 sub-sub-postings 的 subposting 将具有 parent-id,并且它们不会包含在查找 ParentId 为 null 的查询中。
  • 正如我所说,In a real-world application such as you describe。如果您一直在选择所有内容,而不是按需选择,那么您的论坛必须发布很少的帖子才能使其表现良好。

标签: sql common-table-expression


【解决方案1】:

对于单层深度,你不需要使用递归——试试:

SELECT ID, ParentID, Datestamp
FROM ForumMessages
order by coalesce(ParentID,ID), Datestamp

【讨论】:

  • 马克,你先回答。感谢您让我免于过度设计!
【解决方案2】:

没有 CTE 的非常简单的方法(ISNULL 是 MSSQL 中的函数,但您不提供 RDBMS):

SELECT ID, ParentID, Datestamp

FROM ForumMessages

ORDER BY ISNULL(ParentID,ID), DateStamp

Fiddle

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多