Hi someone ask me the same question: How to flatten a hierarchy self-referencing table, Google it and your thread and my first thought is Recursive CTE too, but then I'm just curios how someone do it before R.CTE. This is actually a much better way to do it and it's the fastest.
Try it on AdventureworksDW DimAccount table, the cool thing is: One line of code
SELECT
lev01.AccountKey id_01, lev01.AccountDescription name_01,
lev02.AccountKey id_02, lev02.AccountDescription name_02,
lev03.AccountKey id_03, lev03.AccountDescription name_03,
lev04.AccountKey id_04, lev04.AccountDescription name_04,
lev05.AccountKey id_05, lev05.AccountDescription name_05,
lev06.AccountKey id_06, lev06.AccountDescription name_06,
lev07.AccountKey id_07, lev07.AccountDescription name_07,
lev08.AccountKey id_08, lev08.AccountDescription name_08,
lev09.AccountKey id_09, lev09.AccountDescription name_09,
lev10.AccountKey id_10, lev10.AccountDescription name_10
FROM DimAccount lev01
LEFT OUTER JOIN DimAccount lev02 ON lev01.AccountKey = lev02.ParentAccountKey
LEFT OUTER JOIN DimAccount lev03 ON lev02.AccountKey = lev03.ParentAccountKey
LEFT OUTER JOIN DimAccount lev04 ON lev03.AccountKey = lev04.ParentAccountKey
LEFT OUTER JOIN DimAccount lev05 ON lev04.AccountKey = lev05.ParentAccountKey
LEFT OUTER JOIN DimAccount lev06 ON lev05.AccountKey = lev06.ParentAccountKey
LEFT OUTER JOIN DimAccount lev07 ON lev06.AccountKey = lev07.ParentAccountKey
LEFT OUTER JOIN DimAccount lev08 ON lev07.AccountKey = lev08.ParentAccountKey
LEFT OUTER JOIN DimAccount lev09 ON lev08.AccountKey = lev09.ParentAccountKey
LEFT OUTER JOIN DimAccount lev10 ON lev09.AccountKey = lev10.ParentAccountKey
WHERE lev01.ParentAccountKey IS NULL --AND lev01.AccountKey =1 uncomment to get just the balance sheet subtree
Found it at and courtesy of:
http://jpbi.blogspot.ca/2007/05/sql-trick-for-flattening-parent-child.html