May be this? I did this only for four levels; if you have more levels, they can be added in a similar way.CREATE TABLE #tmp (Cust INT, ParentCust INT)INSERT INTO #tmp VALUES (1,2),(2,3),(3,-1),(4,2),(5,4);WITH cte (c1,c2,c3,c4,cust,lvl,ParentCust, s) AS( SELECT Cust,NULL,NULL,NULL, cust, 1, ParentCust, cast(Cust AS VARCHAR(MAX)) FROM #tmp WHERE ParentCust = -1 UNION ALL SELECT c.c1, CASE WHEN lvl = 1 THEN t.Cust ELSE c.c2 END, CASE WHEN lvl = 2 THEN t.Cust else c.c3 END, CASE WHEN lvl = 3 THEN t.Cust else c.c4 END, t.Cust, lvl+1, t.ParentCust, CAST(t.Cust AS VARCHAR(MAX)) + '|' + s FROM #tmp t INNER JOIN cte c ON c.Cust = t.ParentCust)SELECT c1,c2,c3,c4 FROM cte ct1WHERE NOT EXISTS (SELECT * FROM CTE ct2 WHERE ct2.s LIKE '%'+ct1.s AND ct1.s <> ct2.s);drop table #tmp;