SQL Server父/子CTE订购问题

时间:2013-11-23 09:59:43

标签: sql sql-server tsql

我需要创建一个返回父记录集的查询,其子记录列在每个父记录下面,按父(根)记录ID排序。

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

enter image description here

我使用了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下面

enter image description here

我也尝试将ORDER BY转换为ParentNoteID, NoteID,但结果更进一步:

enter image description here

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

2 个答案:

答案 0 :(得分:2)

你可以尝试一下:

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 the ORDER BY`子句。

编辑:

如同marc_S一样,如果您没有使用SQL Server 2012,则可以使用CASE WHEN块替换IIF语句。

答案 1 :(得分:2)

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

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