存儲過程經典問題

一問一答:存儲過程經典問題
2007-11-06 17:32

只涉及到一個表: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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章