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的第几级你节点)
SQL 递归找查所有子节点及所有父节的更多相关文章
- sql 递归查询,查出所有子节点
with t as ( select b.* from Base_Department b where ParentId = 'cce4152c-3483-4334-b68d-155da627bca0 ...
- 递归遍历所有xml的节点及子节点
import java.io.File; import java.util.List; import org.dom4j.Attribute; import org.dom4j.Document; i ...
- [SQL]T-Sql 递归查询(给定节点查所有父节点、所有子节点的方法)
T-Sql 递归查询(给定节点查所有父节点.所有子节点的方法) -- 查找所有父节点with tab as( select Type_Id,ParentId,Type_Name from Sys_ ...
- mysql 递归查找菜单节点的所有子节点
背景 ...
- SQL查询树形结构的所有子节点
如下一张表test:id name pid----------- ---------- -----------1 电器 NULL2 家电 13 冰箱 24 洗衣机 25 电脑 16 笔记本 57 平板 ...
- SQL SERVER 2000 遍历父子关系数据的表(二叉树)获得所有子节点 所有父节点及节点层数函数
---SQL SERVER 2000 遍历父子关系數據表(二叉树)获得所有子节点 所有父节点及节点层数函数---Geovin Du 涂聚文--建立測試環境Create Table GeovinDu([ ...
- dom4j递归解析XML字符串所有子节点
/** * dom4j递归解析所有子节点 * * @param childElements * @param mapEle * @return */ public Map<String, Obj ...
- T-Sql 递归查询(给定节点查所有父节点、所有子节点的方法)
-- 查找所有父节点with tab as( select Type_Id,ParentId,Type_Name from Sys_ParamType_V2_0 where Type_Id=316-- ...
- SQL 递归树 子父节点相互查询
if object_id('[tb]') is not null drop table [tb] go create table [tb]([modeid] int,modename varchar( ...
随机推荐
- python 元组列表合并
#create a tuple l = [(,), (,), (,)] print(list(zip(*l)))
- DEV-C++设置C++11标准
DEV-C++默认的标准是C++98,改成C++11的方法如下: Tools -> Compiler Options -> Setting -> Code Generation -& ...
- ubuntu14.04 设置开机自启动脚本
方法1.将脚本放入/etc/rc.local文件中. 方法2.添加一个ubuntu的开机启动服务 分为以下几个步骤: 1)新建一个脚本文件 new_services.sh #!/bin/bash # ...
- Springboot 学习遇到的一些错和埋坑之旅
1. java.lang.IllegalStateException: Unable to find a @SpringBootConfiguration, you need to use @Cont ...
- Mutex, semaphore, spinlock
Mutex是一把钥匙,一个人拿了就可进入一个房间,出来的时候把钥匙交给队列的第一个.一般的用法是用于串行化对critical section代码的访问,保证这段代码不会被并行的运行. Semaphor ...
- URAL 1501 Sense of Beauty
URAL 1501 思路: dp+记忆化搜索 状态:dp[i][j]表示选取第一堆前i个和第二堆前j的状态:0:0多1个 1:0和1相等 2:1 ...
- 构造函数用return 会出显什么情况
首先我们都知道js中构造函数一般应该是这样的 function Super (a) { this.a = a; } Super.prototype.sayHello = function() { al ...
- telnet 命令使用方法详解,telnet命令怎么用?
什么是Telnet? 对于Telnet的认识,不同的人持有不同的观点,可以把Telnet当成一种通信协议,但是对于入侵者而言,Telnet只是一种远程登录的工具.一旦入侵者与远程主机建立了Telnet ...
- php安装时开启很多扩展,如果忘了开启某些扩展,以后还能加上吗?答案是可以的
php配置时,这里面开启了很多扩展.如果这时候忘了开启,以后还能加上吗?答案是可以的.以后只需要进入源码的ext目录,例如忘了pdo_mysql,进入ext/pdo_mysql,使用phpize工具, ...
- SGE:qsub/qstat/qdel/qhost 任务投递和监控
参考: Oracle Grid Engine qsub命令 SGE - qsub使用范例 SGE作业基本用法 qsub是最为稳定的底层任务投递系统,就是把一个脚本投递到集群的计算节点上运行. 注意,只 ...