您好,UncleToo欢迎您!  为了更好的浏览本站,请使用高版本浏览器
RSS  Tag     设为首页 | 加入收藏
 您所在的位置:首页 > 数据库技术 > SQL Server

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

作者:UncleToo  来源:互联网  日期:2013-09-27 14:45:57
收藏  评论:( 0 )  阅读:719

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




SQL
 
Server
 
Oracle
 
递归
 
除非特别声明,本站所有PHP教程及其他教程/文章均为原创、翻译或网友投稿,版权均归UncleToo中文网所有, 转载请注明作者及出处。
原文网址:http://www.uncletoo.com/html/sqlserver/368.html
读完这篇文章后,你是否有所收获? 分享是一种生活的信念!
  • 0
  • 0
我来说两句
更多>>网友评论