重新访问SQL Server父/子CTE订购问题

时间:2013-11-24 10:43:25

标签: sql sql-server

昨天,我发布了我认为已经解决的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之后添加了更多的儿童记录后出现了问题。

enter image description here

正如您所看到的那样,具有23482的ParentNoteID之后的子节点似乎没有列在相关的父注释之下,而是在最后。

这是为什么?感谢

更新:这是另一个更简单的例子。如您所见,第二个父母(23499)的孩子不在父母的下面。那么说前面提供的解决方案实际上是否正常工作是否正确?

enter image description here

1 个答案:

答案 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}}

demo