加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

SqlServer 中 类似于Oracle里面的递归查询方法,connect by prio

发布时间:2020-12-12 16:06:41 所属栏目:MsSql教程 来源:网络整理
导读:SqlServer 中 类似于Oracle里面的递归查询方法,connect by prior ,start with。 ? ? ? ? ? ? ? use test set nocount on if object_id('Dept','U') is not null drop table Dept go create table Dept(ID int,ParentID int,Name varchar(20)) ?? insert in

SqlServer 中 类似于Oracle里面的递归查询方法,connect by prior ,start with。

?

?

?

?

?

?

?

use test

set nocount on

if object_id('Dept','U') is not null

drop table Dept

go

create table Dept(ID int,ParentID int,Name varchar(20)) ??

insert into Dept select 1,'AA'?

insert into Dept select 2,1,'BB'?

insert into Dept select 3,'CC' ?

insert into Dept select 4,2,'DD' ?

insert into Dept select 5,3,'EE' ?

insert into Dept select 6,'FF'?

insert into Dept select 7,6,'GG'?

insert into Dept select 8,7,'HH'?

insert into Dept select 9,'II'?

insert into Dept select 10,'JJ'?

insert into Dept select 11,9,'KK'?

?

go ??

SELECT * FROM Dept;

?

--查询树状结构某节点的上级所有根节点。

with cte_root(ID,ParentID,NAME)

as

(

? ? --起始条件

? ? select ID,NAME

? ? from Dept

? ? where Name = 'II' ? --列出子节点查询条件

? ? union all

? ? --递归条件

? ? select a.ID,a.ParentID,a.NAME

? ? from Dept a

? ? inner join?

? ? cte_root b ? ? ? ? ?--执行递归,这里就要理解下了?

? ? on a.ID=b.ParentID ?--根据基础表条件查询子节点(a.ID),通过CTE递归找到其父节点(b.ParentID)。

) ? ? ? ? ? ? ? ? ? ? ? --可以和下面查询子节点的cte_child对比。

select * from cte_root ;

?

--查询树状结构某节点下的所有子节点。

with cte_child(ID,NAME

? ? from Dept

? ? where Name = 'II' --列出父节点查询条件

? ? union all

? ? --递归条件

? ? select a.ID,a.NAME

? ? from Dept a

? ? inner join?

? ? cte_child b

? ? on ( a.ParentID=b.ID) ?--根据查询到的父节点(a.Parent),通过CTE递归查询出其子节点(b.ID)

)

?

select * from cte_child --可以改变之前的查询条件'II'再测试结果

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读