国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > 綜合 > 正文

一問一答:存儲過程經典問題

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開發資料庫,
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 龙山县| 乐昌市| 新建县| 宣城市| 南乐县| 阿瓦提县| 南皮县| 兰坪| 格尔木市| 托克托县| 赤峰市| 克山县| 肥乡县| 济南市| 邯郸县| 崇明县| 庆云县| 芮城县| 云阳县| 乌兰察布市| 兴城市| 临沧市| 时尚| 晋江市| 洛扎县| 永和县| 扎赉特旗| 四平市| 门源| 读书| 内丘县| 曲麻莱县| 柯坪县| 中江县| 磐安县| 蛟河市| 深圳市| 永昌县| 桐城市| 会东县| 祁阳县|