How to find the all child of particular parent using the Recursive Query
--here we are creating the table variable so that we can insert some dummy record Declare @Table Table ( TId int, ParentId int, Name varchar(10) ) --inserting some records --using the union all to insert more than one records insert into @Table Select 1,NULL,'ICT' Union All Select 2,1,'ICT-M1' Union All Select 4,1,'ICT-M2' Union All Select 7,2,'ICT-M1U1' Union All Select 8,2,'ICT-M1U2' Union All Select 9,4,'ICT-M2U1' Union All Select 10,4,'ICT-M2U2' Union All Select 11,7,'ICT-M1U1P1' Union All Select 12,7,'ICT-M1U1P2' Union All Select 13,8,'ICT-M1U2P1' Union All Select 14,8,'ICT-M1U2P2' Union All Select 15,9,'ICT-M2U1P1' Union All Select 16,9,'ICT-M2U1P2' Union All Select 17,10,'ICT-M2U2P1' Union All Select 18,10,'ICT-M2U2P2' --variable to hold data Declare @ChildNode varchar(1000) Set @ChildNode=''; --use the standard recursive query ;with [CTE] as ( --anchor query where we are finding the all parents select TId,ParentId,Name,CAST(ISNULL(CAST(ParentId as varchar(10)),'0') As Varchar(100)) As ChildNode from @Table c where c.[ParentId] is null union all --recursive query where we are finding the all child according to anchor query parent select c.TId,c.ParentId,c.Name, CAST( p.ChildNode +','+cast(c.TId as varchar(10) ) As Varchar(100)) As ChildNode from [CTE] p, @Table c where c.[ParentId] = p.[TId] ) --select the child node as per the id --Assigin the all Ids into one variable select @ChildNode=@ChildNode+','+Cast(TId as varchar(10)) from [CTE] Cross Apply dbo.Split(ChildNode,',') where items=9 order by TId select SUBSTRING(@ChildNode,2,LEN(@ChildNode)) --outpu --2,7,8,11,12,13,14 ---- --create the tabular function to split the multi valued into table Create FUNCTION [dbo].[Split](@String varchar(8000), @Delimiter char(1)) returns @temptable TABLE (items varchar(8000)) as begin declare @idx int declare @slice varchar(8000) select @idx = 1 if len(@String)<1 or @String is null return while @idx!= 0 begin set @idx = charindex(@Delimiter,@String) if @idx!=0 set @slice = left(@String,@idx - 1) else set @slice = @String if(len(@slice)>0) insert into @temptable(Items) values(@slice) set @String = right(@String,len(@String) - @idx) if len(@String) = 0 break end return end
--
Happy Coding
No comments:
Post a Comment