Do an artical (or forum) search on this site for "trees" and/or "hierarchy". Check out the articles AND comments.But here is an example of working with hierarchies. The basic idea is to apply your join above once for each level if nesting.set nocount ondeclare @items Table (itemid int identity(1,1), itemName varchar(10))declare @association Table (itemid int, parentitemid int)declare @tree Table (parentitemid int, itemid int, lev int, struct varchar(200))declare @lev intset @lev = 0insert @items (itemname)select 'item01' unionselect 'item02' unionselect 'item03' unionselect 'item04' unionselect 'item05' unionselect 'item06' unionselect 'item07' unionselect 'item08' unionselect 'item09' unionselect 'item10' unionselect 'item11' unionselect 'item12'order by 1insert @associationselect 1,null union select 2,1 unionselect 3,1 unionselect 4,3 unionselect 5,4 unionselect 6,2 unionselect 7,2 unionselect 8,6 unionselect 9,6 unionselect 10,2 unionselect 11,10 unionselect 12, 1--get the root nodesinsert @treeselect null, a.itemid, @lev, itemnamefrom @association aJOIN @items i ON i.itemid = a.itemidwhere parentitemid is NULL--while children exist for current parent levelwhile @@Rowcount > 0Begin set @lev = @lev + 1 insert @tree select t.itemid, a.itemid, @lev, isNull(t.struct+'.','') + itemname from @association a JOIN @items i ON i.itemid = a.itemid JOIN @tree t ON t.itemid = a.parentitemid and t.lev = @lev - 1 --avoid circular references Left JOIN @tree excl ON excl.parentitemid = a.itemid where excl.itemid is NULLEndselect * from @tree order by itemidselect replicate(char(9), lev) + convert(varchar,i.itemid) + '-' + itemnameFrom @tree tJOIN @items i ON t.itemid = i.itemidOrder by i.itemidoutput:@tree rowsparentitemid itemid lev struct ------------ ----------- ----------- --------------------------------NULL 1 0 item011 2 1 item01.item021 3 1 item01.item033 4 2 item01.item03.item044 5 3 item01.item03.item04.item052 6 2 item01.item02.item062 7 2 item01.item02.item076 8 3 item01.item02.item06.item086 9 3 item01.item02.item06.item092 10 2 item01.item02.item1010 11 3 item01.item02.item10.item111 12 1 item01.item12Dispay of @tree ----------------------------------------------------------------------1-item01 2-item02 3-item03 4-item04 5-item05 6-item06 7-item07 8-item08 9-item09 10-item10 11-item11 12-item12
Be One with the OptimizerTG