基於資料庫的樹型結構方案(儲存過程實現)

2021-04-01 07:14:09 字數 1914 閱讀 5785

樹型結構是遞迴演算法的經典例項(只怪非cs的我沒有紮實的資料結構功底,鼓搗了兩個半天 :p)。有個新聞分類表category,如圖,現在想取出分類資料後以樹型展開並在下拉框中顯示出來。

本來的方案是取出資料後在中間層對datatable排序,格式字串等放在一起操作的,後來感覺中間層負擔太重,所以把排序放到了儲存過程中。參考了sqlserver手冊,終於完成了,分享一下吧。

儲存過程**如下:

程式**:

create proc spmakecatytree

(@child_node int) as

set nocount on

--定義變數

declare @lvl int--層次關係

declare @title char(100)--分類名稱

--生成臨時表 

create table #stack (child_node int,lvl int)

--生成目的表

create table #filelist(lvl int,catyid int,catyname char(100) )

--初始化資料

insert into #stack values(@child_node,0)

select @lvl = 0

--迴圈開始

while @lvl > -1

begin   

if exists(select * from #stack where lvl = @lvl)

--如果存在平輩選項

begin

select @child_node = child_node from #stack where lvl = @lvl

--找到該條真實資料

select @title = **ame from b_category where cateid = @child_node

--儲存輩分等級,原id,分類名稱

insert into #filelist values(@lvl, @child_node, @title)      

--刪除臨時表該條資料     

delete from #stack  where lvl = @lvl and child_node = @child_node      

--向臨時表插入兒子資料      

insert into #stack select cateid,@lvl + 1 from b_category where catepid = @child_node               

--如果以上語句執行-則兒子存在,輩分遞增      

if @@rowcount > 0 

select @lvl = @lvl + 1     

end

else

--不存在平輩資料,返回父輩      

select @lvl = @lvl - 1 

end

--清除初始化資料

delete from #filelist where lvl = 0

--取出排序後的資料

select * from #filelist go

程式**:

/// 

/// 格式化樹型樣式

/// 

/// 

/// 

public datatable formatds(dataset dataset) 

else   

else//非子孫選項樣式 

}  

return dt;   }

}  

/// 

///  列印指定空格數目 

///   

///   子孫輩分(分類深度)

public string countblank(int ier) 

return res;  }

用資料庫實現樹型結構

做 的時候有時需要實現乙個樹形列表,類似目錄那樣的。最好的建立方法就是採用指向父節點的指標的結構建立表。表的結構如下 表名為xx 字段 型別 null 預設 注釋 cidint 11 否 主鍵 pid int 11 否 0 父類別的cid,0表示該項為頂層類別。name varchar 64 否 類...

資料庫 樹型結構 TTreeView篇

1.首先看一下我的資料庫結構 id int group name int parent id int 不用解釋,相信大家一看就明白。2.delphi中新建乙個datemodel,命名為dm,和乙個窗體frmmain 在dm中放入tadoconnection,和乙個tadodataset,並連線上資料...

樹型結構資料在資料庫基本表中的儲存及維護

相關討論連線 早就想簡單說說 關於樹型結構資料的儲存及維護 樹型結構資料的儲存採用 tree id,parentid,remark 如果僅對於儲存來講,無疑是最經濟 但是利用這樣的結構,來提供一些基於稍微複雜點的查詢的應用表現形式 效率應該說相當低下 如 查詢某節點的路徑等 如要高效的查詢,我們可以...