首页 > 开发 > 综合 > 正文

一问一答:存储过程经典问题

2024-07-21 02:05:47
字体:
来源:转载
供稿:网友

只涉及到一个表: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

注册会员,创建你的web开发资料库,
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表