昨天,我发布了我认为已经解决的this issue regarding Parent/Child ordering。
生成一段时间的结果查询是:
SELECT NoteID, ParentNoteID, NoteText
FROM dms_Notes
WHERE DocketID = 43477
ORDER BY CASE WHEN ParentNoteID = 0 THEN NoteID ELSE ParentNoteID END
正如您在下面的输出中所看到的,它运作良好。但后来在NoteID 23480之后添加了更多的儿童记录后出现了问题。
正如您所看到的那样,具有23482的ParentNoteID之后的子节点似乎没有列在相关的父注释之下,而是在最后。
这是为什么?感谢
更新:这是另一个更简单的例子。如您所见,第二个父母(23499)的孩子不在父母的下面。那么说前面提供的解决方案实际上是否正常工作是否正确?
答案 0 :(得分:1)
您可以使用Revursive CTE
找到RootId
,然后您可以在ORDER BY
;WITH c AS
(
SELECT NoteId, NoteId ParentNoteId, NoteId AS RootId, t.NoteText
FROM tbl
WHERE ParentNoteId = 0
UNION ALL
SELECT t.NoteId, t.ParentNoteId, c.RootId, t.NoteText
FROM tbl AS t
INNER JOIN c ON t.ParentNoteId = c.NoteId
WHERE t.NoteId <> 0
)
SELECT
c.NoteId,
CASE WHEN c.ParentNoteId = c.NoteId THEN 0 ELSE c.ParentNoteId END AS ParentId,
c.NoteText
FROM c
ORDER BY RootId, ParentNoteId, NoteId
NoteId ParentId
--------------------
23471 0
23472 23471
23473 23471
23478 23471
23481 23471
23474 23472
23475 23474
23476 0
23477 23476
23482 23476
23484 23482
23485 23482
23486 23482
23487 23482
23480 0
给出的结果如下(文本省略)
{{1}}