zoukankan      html  css  js  c++  java
  • SQL 递归找查所有子节点及所有父节

    在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的第几级你节点)

  • 相关阅读:
    观察者模式
    字符串操作函数
    位域结构体的字节对齐
    备忘任务
    Linux编程下EAGAIN和EINTR宏的含义及处理
    Linux 中write()函数的出错情况及处理
    Nginx配置配置文件nginx.conf的设置
    Linux编程获取本地IP
    redis与memcached比较
    TCP通讯socket自定义协议的实现
  • 原文地址:https://www.cnblogs.com/andycai/p/3928969.html
Copyright © 2011-2022 走看看