You need to traverse Up and Down in seperate recursions. I believe your sample output incorrectly includes rowids (6,7)declare @t table (ROWID int, PCI varchar(3), CI varchar(3))insert @tselect 1, 'A1', 'A4' union allselect 2, 'A1', 'A5' union allselect 3, 'A5', 'A14' union allselect 4, 'A5', 'A15' union allselect 5, 'A6', 'A1' union allselect 6, 'A6', 'A12' union allselect 7, 'A6', 'A13' union allselect 8, 'A16', 'A6' union allselect 9, 'A1', 'A2' union allselect 10, 'A2', 'A8' union allselect 11, 'A2', 'A10' union allselect 12, 'A3', 'A9' union allselect 13, 'A10', 'A11' union allselect 14, 'A1', 'A3' union allselect 15, 'B1', 'B3' union allselect 16, 'B1', 'B4' union allselect 17, 'B2', 'B1' union allselect 18, 'B3', 'B5' union allselect 19, 'C1', 'C3' union allselect 20, 'C1', 'C4' union allselect 21, 'C2', 'C1' union allselect 22, 'C3', 'C5' ;with cte (rowid, pci, ci, lev)as(select rowid, pci, ci, 0from @twhere ci = 'A1'union allselect t.rowid, t.pci, t.ci, c.lev+1from @t tjoin cte c on c.ci = t.pciwhere c.lev >= 0union allselect t.rowid, t.pci, t.ci, c.lev-1from @t tjoin cte c on c.pci = t.ciwhere c.lev <= 0)select * from cteorder by rowidoutput:rowid pci ci lev----------- ---- ---- -----------1 A1 A4 12 A1 A5 13 A5 A14 24 A5 A15 25 A6 A1 08 A16 A6 -19 A1 A2 110 A2 A8 211 A2 A10 212 A3 A9 213 A10 A11 314 A1 A3 1when ordered by lev, rowid:rowid pci ci lev----------- ---- ---- -----------8 A16 A6 -15 A6 A1 01 A1 A4 12 A1 A5 19 A1 A2 114 A1 A3 13 A5 A14 24 A5 A15 210 A2 A8 211 A2 A10 212 A3 A9 213 A10 A11 3
Be One with the OptimizerTG