只涉及到一個表:xkb_treeNode
表結構是這樣:
node_id int //節點id
parentNode_id int //父節點id
node_text varchar //節點內容
isModule bit //是否葉子節點
現在保存的數據有:
node_id parentNode_id node_text isModule
1 -1 語言與文學 0
2 -1 數學 0
3 -1 技術 0
4 1 語文 0
5 1 外語 0
6 5 英語 0
7 6 初中英語 0
8 7 特斯塔 1
9 4 測定是2 1
10 2 測試3 1
現在問題是:
能否通過做一個存儲過程,
根據表中的isModule字段的取值(取值為1的表示最終葉子結點),
比如“特斯塔”為葉子節點,層層向上遞進找到”特斯塔“的祖先節點:
特斯塔-〉初中英語-〉英語-〉外語-〉語言與文學
即通過”特斯塔“找到”語言與文學“來
最終返回的形態為:
葉子節點id 父節點id 節點名稱 祖先節點名稱 祖先節點id
8 7 特斯塔 語言與文學 1
9 4 測定是2 語言與文學 1
10 2 測試3 數學 2
/////////////////////////////////////////////////////////////////////////
正確答案:
--生成測試數據
create table xkb_treeNode(
node_id int,
parentNode_id int,
node_textvarchar(10),
isModulebit)
insert into xkb_treeNode select 1 ,-1,'語言與文學',0
insert into xkb_treeNode select 2 ,-1,'數學',0
insert into xkb_treeNode select 3 ,-1,'技術',0
insert into xkb_treeNode select 4 , 1,'語文',0
insert into xkb_treeNode select 5 , 1,'外語',0
insert into xkb_treeNode select 6 , 5,'英語',0
insert into xkb_treeNode select 7 , 6,'初中英語',0
insert into xkb_treeNode select 8 , 7,'特斯塔' ,1
insert into xkb_treeNode select 9 , 4,'測定是2',1
insert into xkb_treeNode select 10 , 2,'測試3',1
--創建存儲過程
create procedure sp_test
as
begin
select
a.node_id,
a.parentNode_id,
a.node_text,
b.node_id as ancestor_id ,
b.node_text as ancestor_text
into
#t
from
xkb_treeNode a,xkb_treeNode b
where
a.parentNode_id = b.node_id and a.isModule = 1
while(exists(select 1 from xkb_treeNode a,#t b where a.node_id=ancestor_id and a.parentNode_id != -1))
begin
update #t
set
ancestor_id = b.p_id,
ancestor_text = b.p_text
from
#t a,
(select
c.node_id,
d.node_id as p_id,
d.node_text as p_text
from
xkb_treeNode c,xkb_treeNode d
where
c.parentNode_id = d.node_id) b
where
a.ancestor_id = b.node_id
end
select * from #t order by node_id
end
--執行存儲過程,結果樓主自己看
exec sp_test