SqlServer 中 类似于Oracle里面的递归查询方法,connect by prio
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'再测试结果 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |