SQLSERVER 树级递归查询

根据父ID 查询所有子节点

-- with一个临时表(括号中是你要查询的列名)
with temp(subject_id,parent_id,Name,curLevel)as
(--1:初始查询(这里的PID=-1 在我的数据中是最底层的根节点)
select subject_id,parent_id,Name,1 as level from Subject
where  parent_id = 1   -- 注意这里   
union all
--2:递归条件
select a.subject_id,a.parent_id,a.Name, b.curLevel+1 from Subject a   --3:这里的临时表和原始数据表都必须使用别名,不然递归的时候不知道查询的是那个表的列
inner join
temp b
on ( a.parent_id=b.subject_id)  --这个关联关系很重要,一定要理解一下谁是谁的父节点
)
select * from temp   --4:递归完成后 一定不要少了这句查询语句 否则会报错

根据id查询所有父节点

-- with一个临时表(括号中是你要查询的列名)
with temp(org_id,parent_id,org_name,curLevel)as
(
-- 1:初始查询(这里的PID=-1 在我的数据中是最底层的根节点)
select org_id,parent_id,org_name,1 as level from Organization
where  org_id = 10101    -- 注意这里   
union all
-- 2:递归条件
select a.org_id,a.parent_id,a.org_name, b.curLevel+1 from Organization a   
-- 3:这里的临时表和原始数据表都必须使用别名,不然递归的时候不知道查询的是那个表的列
inner join
temp b
on ( b.parent_id=a.org_id)  -- 这个关联关系很重要,一定要理解一下谁是谁的父节点
)
select * from temp   -- 4:递归完成后 一定不要少了这句查询语句 否则会报错

查询给定节点的所有父级节点和子节点

with tail(org_id,parent_id,org_name)as
(
select org_id,parent_id,org_name from Organization
where  parent_id = 10101   
union all
select a.org_id,a.parent_id,a.org_name from Organization a   
inner join
tail b
on ( a.parent_id=b.org_id)  
),head(org_id,parent_id,org_name)as
(
select org_id,parent_id,org_name from Organization
where  org_id = 10101      
union all
select a.org_id,a.parent_id,a.org_name from Organization a   
inner join
head b
on ( b.parent_id=a.org_id)  
)
select * from head
union
select * from tail


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值