# 辰o(^o^)o的专栏[除非注释原创，其它文章基本来源于网络]

## 一问一答：存储过程经典问题

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

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

posted on 2005-02-28 21:30 阅读(80) 评论(0)  编辑  收藏 所属分类: 数据库相关

 只有注册用户登录后才能发表评论。 网站导航: 相关文章: