樹型結構是遞迴演算法的經典例項(只怪非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 如果僅對於儲存來講,無疑是最經濟 但是利用這樣的結構,來提供一些基於稍微複雜點的查詢的應用表現形式 效率應該說相當低下 如 查詢某節點的路徑等 如要高效的查詢,我們可以...