我需要创建一个返回父记录集的查询,其子记录列在每个父记录下面,按父(根)记录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
,但结果更进一步:
出了什么问题,为什么这不起作用?我试图将其完全基于已接受的解决方案,但它似乎无法正常工作?感谢。
答案 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