Goal
Using CTE show a complete tree view.Challenge
When a developer tries to search CTE in internet, there are millions of articles which already exists which says to get a tree view using CTE. But there is a problem with most of them. They dont give correct output. For making the data show in correct way users should enter data in an order, else it wont come. So first I will explain how the examples on internet mislead.SQL - Create temp table
-- DECLARE DECLARE @Company AS TABLE(EmpID INT, ParentID INT, PersonName VARCHAR(100)); -- Insert Temp Records INSERT INTO @Company(EmpID, ParentID, PersonName) VALUES(1 , NULL , 'Maulik Dhorajia') , (2 , NULL , 'Bhavesh Gohel') , (3 , NULL , 'Dinesh Padhiyar') , (4 , 2 , 'Vijay Kumar') , (5 , 1 , 'Jitendra Makwana') , (6 , 4 , 'Jayesh Dhobi') , (7 , 1 , 'Shivpalsinh Jhala') , (8 , 5 , 'Amit Patel') , (9 , 3 , 'Abidali Suthar') -- Default data
SELECT * FROM @Company;

SQL - Which usually misleads to get correct tree view
-- Incorrect result which we usually find on Internet ;WITH CTECompany AS ( SELECT EmpID, ParentID, PersonName , 0 AS HLevel FROM @Company WHERE ParentID IS NULL UNION ALL SELECT C.EmpID, C.ParentID, C.PersonName , (CTE.HLevel + 1) AS HLevel FROM @Company C INNER JOIN CTECompany CTE ON CTE.EmpID = C.ParentID WHERE C.ParentID IS NOT NULL ) -- Misleading SQL SELECT * FROM ( SELECT EmpID , ParentID , HLevel , (REPLICATE( '----' , HLevel ) + PersonName) AS Person FROM CTECompany ) AS P ORDER BY HLevel;

SQL - Correct CTE with Tree View
-- Working Example ;WITH CTECompany AS ( SELECT EmpID, ParentID, PersonName , 0 AS HLevel, CAST(RIGHT(REPLICATE('_',5) + CONVERT(VARCHAR(20),EmpID),20) AS VARCHAR(MAX)) AS OrderByField FROM @Company WHERE ParentID IS NULL UNION ALL SELECT C.EmpID, C.ParentID, C.PersonName , (CTE.HLevel + 1) AS HLevel, CTE.OrderByField + CAST(RIGHT(REPLICATE('_',5) + CONVERT(VARCHAR(20),C.EmpID),20) AS VARCHAR(MAX)) AS OrderByField FROM @Company C INNER JOIN CTECompany CTE ON CTE.EmpID = C.ParentID WHERE C.ParentID IS NOT NULL ) -- Working Example SELECT EmpID , ParentID , HLevel , PersonName , (REPLICATE( '----' , HLevel ) + PersonName) AS Person FROM CTECompany ORDER BY OrderByField,PersonName;

Hope this helped and saved a lot of your time!
Reply for the comment "Nice try. still relies on order of data entry. add (44 , 1 , 'XXitendra Makwana')". I tried to see what was wrong but I can see the correct tree with the same query. Not sure what is wrong. Can anyone else see the issue and post a comment? Thanks in advance.