【问题标题】:SQL Server Parent/Child CTE Ordering issueSQL Server 父/子 CTE 排序问题
【发布时间】:2015-03-25 03:34:16
【问题描述】:

我需要创建一个查询,该查询返回父注释的记录集,它们的子注释列在每个父注释下方,按父(根)注释 ID 排序。

例如,这是我想看到的输出:

我使用了this page 接受的解决方案,是这样的:

SELECT ID, ParentID, Datestamp
FROM ForumMessages
ORDER BY coalesce(ParentID, ID), Datestamp

我的查询结果是:

SELECT NoteID, ParentNoteID, NoteText
FROM dms_Notes
WHERE DocketID = 43477 -- this filter is just to make the resultset smaller
ORDER BY Coalesce(NoteID, ParentNoteID), NoteText

这导致了以下输出。如您所见,id 为 23478 的最后一条记录未列在父级 23471 下方

我也尝试将ORDER BY 切换为ParentNoteID, NoteID,但结果更差:

出了什么问题,为什么这不起作用?我试图将它完全基于公认的解决方案,但它似乎无法正常工作?谢谢。

【问题讨论】:

    标签: sql sql-server tsql


    【解决方案1】:

    你可以试试:

    SELECT NoteID, ParentNoteID, NoteText
    FROM dms_Notes
    WHERE DocketID = 43477 -- this filter is just to make the resultset smaller
    ORDER BY IIF(ParentNoteID <> 0, ParentNoteID, NoteID), NoteText
    

    COALESCE 函数返回IS NOT NULL 的第一个元素,但您使用0 而不是NULL 来检查元素是否为父元素。

    在提供的 StackOverflow 链接中,用户正在使用 NULL' to do this. Because of this you have to change the condition logic user in theORDER BY` 子句。

    编辑:

    正如marc_S在他的评论中指出的那样,如果您没有使用SQL Server 2012,您可以将IIF语句替换为CASE WHEN块。

    【讨论】:

    • IIF 是 SQL Server 2012 中的新功能 - 它在早期版本中不可用
    • @gotqn 我应该看到的。很好发现并感谢您的帮助。
    【解决方案2】:

    您的设置与引用的帖子不同。具体来说,当它没有父代而不是 NULL 时,您的 parentid 为 0。所以,COALESCE 永远不会做任何事情。所以,你需要这样的东西:

    Order by case when parentid = 0 then noteid else parentid end
    

    【讨论】:

      猜你喜欢
      • 2013-02-22
      • 2014-05-19
      • 1970-01-01
      • 2017-08-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多