在SQL的树型结构中,很多时候,知道某一节点的值,需要查找该节点的所有子节点(包括多级)的功能,这时就需要用到如下的用户自定义函数.

表结构如下:

ID int
Dep_Type int
Dep_Code varchar(50)
Dep_Name varchar(50)
Dep_Dian int
Dep_FathID int
Dep_Opera varchar(50)
Dep_Status int
Dep_AddTime datetime

用户自定义函数如下:

create function f_getChild(@ID VARCHAR(10)) 
returns @t table(ID VARCHAR(10),PID VARCHAR(10),Level INT) 
as 
begin 
    declare @i int,@ret varchar(8000) 
    set @i = 1 
    insert into @t select ID,Dep_FathID,@i from H_Dep_Info where Dep_FathID = @ID 
    while @@rowcount<>0 
    begin 
      set @i = @i + 1 
      insert into @t select a.ID,a.Dep_FathID,@i from H_Dep_Info a,@t b where a.Dep_FathID=b.ID and b.Level = @i-1 
    end 
    return 
end

执行操作如下:

select ID from f_getChild(1)

返回值就是所有的子节点

查找父节点的函数如下:

CREATE FUNCTION [f_getParent](@id int) 
  RETURNS @re TABLE(id int,pid int,level int) 
  AS 
  begin 
  declare @level int 
  set @level = 1 
  declare @pid int 
  select @pid = pid from tb where id = @id 
  insert @re 
  select id,pid,@level from tb where id = @pid 
  while @@rowcount > 0   
  begin 
  set @level = @level + 1 
  select @pid = pid from tb where id = @pid 
  insert @re 
  select id,pid,@level from tb where id = @pid 
  end 
  return 
  end

执行操作如下:

select * from f_getParent(8)

返回的列有id,pid,level

其中id就是8的父节点,pid就是id的父节点,level就是级数(表示这个id是8的第几级你节点)

SQL 递归找查所有子节点及所有父节的更多相关文章

  1. sql 递归查询,查出所有子节点

    with t as ( select b.* from Base_Department b where ParentId = 'cce4152c-3483-4334-b68d-155da627bca0 ...

  2. 递归遍历所有xml的节点及子节点

    import java.io.File; import java.util.List; import org.dom4j.Attribute; import org.dom4j.Document; i ...

  3. [SQL]T-Sql 递归查询(给定节点查所有父节点、所有子节点的方法)

    T-Sql 递归查询(给定节点查所有父节点.所有子节点的方法)   -- 查找所有父节点with tab as( select Type_Id,ParentId,Type_Name from Sys_ ...

  4. mysql 递归查找菜单节点的所有子节点

    背景                                                                                                   ...

  5. SQL查询树形结构的所有子节点

    如下一张表test:id name pid----------- ---------- -----------1 电器 NULL2 家电 13 冰箱 24 洗衣机 25 电脑 16 笔记本 57 平板 ...

  6. SQL SERVER 2000 遍历父子关系数据的表(二叉树)获得所有子节点 所有父节点及节点层数函数

    ---SQL SERVER 2000 遍历父子关系數據表(二叉树)获得所有子节点 所有父节点及节点层数函数---Geovin Du 涂聚文--建立測試環境Create Table GeovinDu([ ...

  7. dom4j递归解析XML字符串所有子节点

    /** * dom4j递归解析所有子节点 * * @param childElements * @param mapEle * @return */ public Map<String, Obj ...

  8. T-Sql 递归查询(给定节点查所有父节点、所有子节点的方法)

    -- 查找所有父节点with tab as( select Type_Id,ParentId,Type_Name from Sys_ParamType_V2_0 where Type_Id=316-- ...

  9. SQL 递归树 子父节点相互查询

    if object_id('[tb]') is not null drop table [tb] go create table [tb]([modeid] int,modename varchar( ...

随机推荐

  1. python 元组列表合并

    #create a tuple l = [(,), (,), (,)] print(list(zip(*l)))

  2. DEV-C++设置C++11标准

    DEV-C++默认的标准是C++98,改成C++11的方法如下: Tools -> Compiler Options -> Setting -> Code Generation -& ...

  3. ubuntu14.04 设置开机自启动脚本

    方法1.将脚本放入/etc/rc.local文件中. 方法2.添加一个ubuntu的开机启动服务 分为以下几个步骤: 1)新建一个脚本文件 new_services.sh #!/bin/bash # ...

  4. Springboot 学习遇到的一些错和埋坑之旅

    1. java.lang.IllegalStateException: Unable to find a @SpringBootConfiguration, you need to use @Cont ...

  5. Mutex, semaphore, spinlock

    Mutex是一把钥匙,一个人拿了就可进入一个房间,出来的时候把钥匙交给队列的第一个.一般的用法是用于串行化对critical section代码的访问,保证这段代码不会被并行的运行. Semaphor ...

  6. URAL 1501 Sense of Beauty

    URAL 1501 思路: dp+记忆化搜索 状态:dp[i][j]表示选取第一堆前i个和第二堆前j的状态:0:0多1个              1:0和1相等                2:1 ...

  7. 构造函数用return 会出显什么情况

    首先我们都知道js中构造函数一般应该是这样的 function Super (a) { this.a = a; } Super.prototype.sayHello = function() { al ...

  8. telnet 命令使用方法详解,telnet命令怎么用?

    什么是Telnet? 对于Telnet的认识,不同的人持有不同的观点,可以把Telnet当成一种通信协议,但是对于入侵者而言,Telnet只是一种远程登录的工具.一旦入侵者与远程主机建立了Telnet ...

  9. php安装时开启很多扩展,如果忘了开启某些扩展,以后还能加上吗?答案是可以的

    php配置时,这里面开启了很多扩展.如果这时候忘了开启,以后还能加上吗?答案是可以的.以后只需要进入源码的ext目录,例如忘了pdo_mysql,进入ext/pdo_mysql,使用phpize工具, ...

  10. SGE:qsub/qstat/qdel/qhost 任务投递和监控

    参考: Oracle Grid Engine qsub命令 SGE - qsub使用范例 SGE作业基本用法 qsub是最为稳定的底层任务投递系统,就是把一个脚本投递到集群的计算节点上运行. 注意,只 ...