前言
前幾天朋友問我,關於sqlserver資料庫中對樹形結構的表資料統計問題,需求大致如下:
分類表(遞迴資料),a的子分類是b,b的子分類是c……分類關係不間斷,a為第一層,b為第二層,c為第三層……需要統計「每個分類所在的層數」、「子分類的總數」和「子分類的層數」。
解決思路:
建立示例表結構,**如下:
--步驟一:每個分類所在的層數分類示例表
create
table
temp_class
( classid
intprimary
keyidentity(1,1), --
分類id,主鍵,遞增
classname nvarchar(50), --
分類名稱
pcid int
default
0, --
父級分類id,0表示最頂層
ulevel int, --
層數 nextucount int, --
子分類的總數
nextlevelcount int
--子分類的層數
);--
層數字段新增索引
--create index ind_tempclass_ulevel on temp_class(ulevel);
--新增測試資料。。。。。。
根據樹形資料結構的規律,在統計層數時,需要從最頂層向下累計,**如下:
--步驟二:子分類的總數1、更新層數(pcid=0 表示第一層)
--更新最頂層
declare
@iint
=1; --
第一層update temp_class set ulevel=
@iwhere pcid=0;
while(1=1
) begin
if(not
exists(select
top1
1from temp_class a where
exists(select
top1
1from temp_class b where b.ulevel=
@iand b.classid=
a.pcid)))
break; --
無下層資料,跳出迴圈
--更新下一層
update a set a.ulevel=@i+
1from temp_class a where
exists(select
top1
1from temp_class b where b.ulevel=
@iand b.classid=
a.pcid);
--增加一層
set@i=@i
+1;
end;
--步驟三:子分類的層數2、更新子分類的總數
--獲取最低層分類(最大的層數)
declare
@maxlevel
int=1;
select
@maxlevel
=max(ulevel) from
temp_class;
--更新最底層的子分類總數為 0
update temp_class set nextucount=
0where ulevel=
@maxlevel;--
從最底層向上累計子分類總數
while(1=1
) begin
set@maxlevel
=@maxlevel-1
;
if(@maxlevel
<=
0) --
層數走完,退出
break
;
--更新上一層的子分類的總數
update a set a.nextucount=
isnull(b.nextucount,0) from
temp_class a
left
join
--父級(本層)分類的個數=下一層中子分類的個數之和+下一層的分類數量
(select pcid,sum(nextucount)+
count(classid) nextucount from temp_class where ulevel=
@maxlevel+1
group
bypcid) b
on a.classid=
b.pcid
where a.ulevel=
@maxlevel;
end;
--查詢結果:3、更新子分類的層數
--獲取最低層子分類(最大的層數)
declare
@maxlevel
int=1;
select
@maxlevel
=max(ulevel) from
temp_class;
--更新最底層的子分類層數為 0
update temp_class set nextlevelcount=
0where ulevel=
@maxlevel;--
從最底層向上累計層數
while(1=1
) begin
set@maxlevel
=@maxlevel-1
;
if(@maxlevel
<=
0) --
層數走完,退出
break
;
--更新上一層的子分類層數
update a set a.nextlevelcount=
isnull(b.nextlevelcount,0) from
temp_class a
left
join
--父級(本層)分類的層數=下一層中子分類的最大層數+1(當前子分類為 1 層)
(select pcid,(max(nextlevelcount)+
1) as nextlevelcount from temp_class where ulevel=
@maxlevel+1
group
bypcid) b
on a.classid=
b.pcid
where a.ulevel=
@maxlevel;
end;
後言該隨筆僅當個人筆記所用,路過的大神如有好的建議,還請賜教,菜鳥再此感激不盡!
行資料結構轉成樹形資料結構
背景 在前後端開發過程中,後端負責提供介面資料,有時前端需要把介面資料轉成其他的格式,本文就用於將具備父子邏輯的行資料轉成樹形結構。如下 function rowdatatotreedata roottreenode,rowdata else i i 1 if roottreenode.childr...
樹形資料結構實現平鋪展示
後端返回的資料是樹形結構要實現這種類似平鋪樹的結構 基本思路 取出最後兩級,取出每一級的所有祖先節點 只獲取最後兩級得資料 lastleveldata data go el 遞迴 else function go item go child else if child.isbottomlevel s...
樹形資料結構複習 先 中 後序遍歷
1.已知按層遍歷和中序遍歷,匯出先序遍歷 樣例 中序遍歷 dbafegc 按層遍歷 abcdefg 演算法 掃瞄按層遍歷,按層遍歷的實質是按照節點深度,從左到右對同深度節點進行排序 因此,可以掃瞄整個按層遍歷,與當前中序遍歷所代表的樹進行匹配!在中序遍歷中掃瞄到的位於按層遍歷中的最前面的節點,就是當...