SqlServer 中 类似于Oracle里面的递归查询方法,connect by prior ,start with。
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,0,'AA'?
insert into Dept select 2,1,'BB'?
insert into Dept select 3,1,'CC' ?
insert into Dept select 4,2,'DD' ?
insert into Dept select 5,3,'EE' ?
insert into Dept select 6,0,'FF'?
insert into Dept select 7,6,'GG'?
insert into Dept select 8,7,'HH'?
insert into Dept select 9,7,'II'?
insert into Dept select 10,7,'JJ'?
insert into Dept select 11,9,'KK'?
?
go ??
SELECT * FROM Dept;
?
--查询树状结构某节点的上级所有根节点。
with cte_root(ID,ParentID,NAME)
as
(
? ? --起始条件
? ? select ID,ParentID,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,ParentID,NAME)
as
(
? ? --起始条件
? ? select ID,ParentID,NAME
? ? from Dept
? ? where Name = 'II' --列出父节点查询条件
? ? union all
? ? --递归条件
? ? select a.ID,a.ParentID,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'再测试结果