zoukankan      html  css  js  c++  java
  • (原创)基于关系数据库系统链式存储的树型结构数据,求某结点下的子树所有结点算法(tsql语言实现)

    (原创)基于关系数据库系统链式存储的树型结构数据,求某结点下的子树所有结点算法(t-sql语言实现) 

    CREATE FUNCTION  f_subtree(@dpcode varchar(9))  /*树型结构数据,求某结点下的的子树所有结点的自定义函数*/
    RETURNS  @new table([dpcode] [varchar] (9)  ,     --结点编码
     [dpname] [varchar] (20) ,  --结点名称
     [dpcode_p] [varchar] (9) --此结点的父结点编码
    )  AS 
    BEGIN
    declare @temp table([dpcode] [varchar] (9)  ,     --结点编码
     [dpname] [varchar] (20) ,  --结点名称
     [dpcode_p] [varchar] (9)   --此结点的父结点编码
    )  --数据临时存放表
    declare @t table([dpcode] [varchar] (9)  ,     --结点编码
     [dpname] [varchar] (20) ,  --结点名称
     [dpcode_p] [varchar] (9)   --此结点的父结点编码
    )   --中间临时表
    declare @tt table([dpcode] [varchar] (9)  ,     --结点编码
     [dpname] [varchar] (20) ,  --结点名称
     [dpcode_p] [varchar] (9)   --此结点的父结点编码
    )  --中间交换临时表

    delete   @temp
    delete  @t
    delete @tt
    delete  @new


    insert into @temp select *  from dpet    
      insert into @t  select * from @temp where dpcode_p=@dpcode  
      insert into @new  select * from @t  --结果临时表
      while (exists(select * from @t where dpcode in (select dpcode_p from @temp)))
        --当某层的结点全为叶子时,才停止循环
        begin
          insert into @tt select * from @t --中间交换临时表
          delete @t
          insert into @t select * from @temp where dpcode_p in
            (select dpcode from @tt)
          delete @tt
          insert into @new select * from @t
        end
      insert into @new select * from @temp where dpcode=@dpcode 

    return
    END

    ---------------------------------------------------(以下为存储过程实现) 

    CREATE TABLE dpet (   --树型结构数据的数据存放表结构
     [dpcode] [varchar] (9)  ,     --结点编码
     [dpname] [varchar] (20) ,  --结点名称
     [dpcode_p] [varchar] (9)   --此结点的父结点编码
    ) ON [PRIMARY]

    /*ms sql 2000调试通过,表temp,t,new,tt 结构与表dpet一致*/

    CREATE PROCEDURE  desc_dept(@dpcode varchar(9))   AS
    --树型结构数据,求某结点下的的子树所有结点
      truncate table temp
      truncate table t
      truncate table tt
      truncate table new
      insert into temp select *  from dpet    --数据临时存放表
      insert into t  select * from temp where dpcode_p=@dpcode  --中间临时表
      insert into new  select * from t  --结果临时表
      while (exists(select * from t where dpcode in (select dpcode_p from temp)))
        --当某层的结点全为叶子时,才停止循环
        begin
          insert into tt select * from t --中间交换临时表
          truncate table t
          insert into t select * from temp where dpcode_p in
            (select dpcode from tt)
          truncate table tt
          insert into new select * from t
        end
      insert into new select * from temp where dpcode=@dpcode
    GO

  • 相关阅读:
    shell之ping减少时间间隔&ping的次数&用IP1去ping IP2的技巧
    kali界面乱码解决方案记录
    win10子系统kali-linux安装图形化界面总结
    树莓派4 64bit 编译安装QT5.13.2 和 Redis Desktop Manager 2020.1-dev
    树莓派4 (8GB) RaspiOS 64 bit 入手配置流程 2020-06-10
    阿里巴巴Java开发手册(泰山版)个人阅读精简
    Java 8 新API Steam 流 学习笔记
    IDEA中maven项目部署到云服务器上(简易)
    收藏模块的设计
    js常用代码片段(更新中)
  • 原文地址:https://www.cnblogs.com/cyz1980/p/317380.html
Copyright © 2011-2022 走看看