SQL父子树排序顺序
假设这台SQL父子树排序顺序
ParentId ChildId SortOrder
---------------------------------
0 1 0
1 2 1
2 3 1
2 4 2
2 6 3
1 7 2
1 9 3
9 10 1
9 12 2
如何将我写一个简单的CTE(或其他类型的查询),将返回他们的父/子关系,在任何级别,但保持排序 - 为父母下方的所有子项目订购。
基本上,这将是一个简单的树视图,其中子项按特定的排序顺序排列。
的SQL Server 2008是DB
更新: 可以有无限的父/子级别 - 我尝试从其它栈的问题/回答一些例子,但没有包括在子级别排序顺序。
一个例子的结果应该是:
parent (sort 0)
child (sort 1)
child (sort 2)
child (sort 3)
child-child (sort 1)
child (sort 4)
child-child (sort 1)
child-child (sort 2)
等
希望这是有道理的 - 也许我是看着这个错误,这种结果是更好地进行中期内构建梯队?
反正,任何反馈非常赞赏
具有特殊排序覆盖的递归CTE。注意在2孩子的那种倍率(我修改源表略有测试这种能力)
declare @relations table(ParentID int, ChildID int, SortOrder int, treeID int);
insert into @relations values
(0,1,0,0), (1,2,1,0), (2,3,2,0), (2,4,1,0), (2,6,3,0), (1,7,2,0), (1,9,3,0), (9,10,1,0), (9,12,2,0) --tree 0
, (0,1,0,1), (1,2,1,1), (2,3,2,1), (2,4,1,1), (2,6,3,1), (1,7,2,1), (1,9,3,1), (9,10,1,1), (9,12,2,1) --tree 1
; with cte(ParentId,ChildId,SortOrder,depth,agg,treeID) as (
select null,ParentId,SortOrder,0
, right('0000000'+CAST(treeID as varchar(max)),7)
+right('0000000'+CAST(SortOrder as varchar(max)),7)
, treeID
from @relations where ParentId=0
union all
select cte.ChildId,r.ChildId,r.SortOrder,cte.depth+1
, cte.agg
+right('0000000'+CAST(r.treeID as varchar(max)),7)
+right('0000000'+CAST(r.SortOrder as varchar(max)),7)
+right('0000000'+CAST(r.ChildId as varchar(max)),7)
, r.treeID
from cte
inner join @relations r on r.ParentID=cte.ChildId
where cte.depth<32767
and r.treeID=cte.treeID
)
select
tree=case depth when 1 then cast(ParentID as varchar(30))+' (sort '+cast(SortOrder as varchar(30))+')'
else REPLICATE(CHAR(9),depth-1)
+ cast(ChildId as varchar(30))+' (sort '+cast(SortOrder as varchar(30))+')'
end
from cte
where depth>0
order by agg
option (maxrecursion 32767);
结果:
tree
--------------------------------------------------
0 (sort 0)
2 (sort 1)
4 (sort 1)
3 (sort 2)
6 (sort 3)
7 (sort 2)
9 (sort 3)
10 (sort 1)
12 (sort 2)
0 (sort 0)
2 (sort 1)
4 (sort 1)
3 (sort 2)
6 (sort 3)
7 (sort 2)
9 (sort 3)
10 (sort 1)
12 (sort 2)
哇 - 这将需要一些时间来研究:)感谢您的伟大答案 – Andre 2012-03-13 03:36:52
嘿约翰 - 在这里使用你的例子,并与一些事情(可能微不足道)挣扎。我如何修改这条语句,以便我可以在表格中存储多棵树?意思是,如果我只有一个主根(其中parentid = 0),如果我想存储一个单独的树(parentid = 0),并使用“from @relations where ParentId = 0和childid = 45) - 目前这似乎不符合这个声明?希望这是有道理的 – Andre 2012-03-30 21:53:37
嗨安德烈。看起来像你喜欢具有挑战性的问题:) 这可能有点设计,但我添加了一个基于0我修改了上面的解决方案,以显示两棵外表相同的树,它们只通过它们的treeID区分开来。 – 2012-04-02 03:56:51
你能给什么样的结果,是为了看起来像一个例子? – hofnarwillie 2012-03-13 00:21:24