隨筆 - 3, 文章 - 152, 評論 - 17, 引用 - 0
          數(shù)據(jù)加載中……

          一問一答:存儲過程經(jīng)典問題

          只涉及到一個表:xkb_treeNode

          表結構是這樣:
          node_id          int      //節(jié)點id
          parentNode_id    int      //父節(jié)點id
          node_text        varchar  //節(jié)點內(nèi)容
          isModule         bit      //是否葉子節(jié)點

          現(xiàn)在保存的數(shù)據(jù)有:

          node_id  parentNode_id  node_text        isModule
             1        -1          語言與文學           0
             2        -1            數(shù)學               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


          現(xiàn)在問題是:
          能否通過做一個存儲過程,
          根據(jù)表中的isModule字段的取值(取值為1的表示最終葉子結點),
          比如“特斯塔”為葉子節(jié)點,層層向上遞進找到”特斯塔“的祖先節(jié)點:
          特斯塔-〉初中英語-〉英語-〉外語-〉語言與文學
          即通過”特斯塔“找到”語言與文學“來

          最終返回的形態(tài)為:
          葉子節(jié)點id  父節(jié)點id      節(jié)點名稱      祖先節(jié)點名稱  祖先節(jié)點id
             8           7           特斯塔        語言與文學       1
             9           4           測定是2       語言與文學       1
             10          2           測試3           數(shù)學           2

           

          /////////////////////////////////////////////////////////////////////////
          正確答案:

           --生成測試數(shù)據(jù)
          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,'數(shù)學',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


          --創(chuàng)建存儲過程
          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


          --執(zhí)行存儲過程,結果樓主自己看
          exec sp_test

          posted on 2005-02-28 21:30 閱讀(158) 評論(0)  編輯  收藏 所屬分類: 數(shù)據(jù)庫相關

          主站蜘蛛池模板: 咸丰县| 泰和县| 天气| 南漳县| 莲花县| 合山市| 正镶白旗| 长乐市| 金阳县| 蒲城县| 大兴区| 安福县| 东阿县| 禹州市| 高唐县| 荣成市| 马山县| 安吉县| 和平区| 大足县| 咸宁市| 奉贤区| 革吉县| 化州市| 宁城县| 古浪县| 浦东新区| 阿瓦提县| 平凉市| 灵丘县| 青神县| 石河子市| 星子县| 迭部县| 怀宁县| 金门县| 博白县| 靖远县| 镇沅| 闸北区| 建昌县|