首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

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

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

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'再测试结果

热点排行