With SQL2005 and above, you can use recursion:-- *** Test Data ***CREATE TABLE #t( ID int NOT NULL ,[Name] varchar(50) NOT NULL ,ParentID int NULL)INSERT INTO #tSELECT 1, 'Group 1: Culture and Recreation', NULLUNION ALL SELECT 2, 'Culture and Arts', 1UNION ALL SELECT 3, 'Media and communications.', 2UNION ALL SELECT 4, 'Visual arts, architecture, ceramic art.', 2UNION ALL SELECT 5, 'Performing arts.', 2UNION ALL SELECT 6, 'Historical, literary, and humanistic societies.', 2UNION ALL SELECT 7, 'Museums.', 2UNION ALL SELECT 8, 'Zoos and aquariums.', 2-- *** End Test Data ***;WITH rCTEAS( SELECT ID, [Name], ParentID, 1 AS rlevel FROM #t WHERE ParentID IS NULL UNION ALL SELECT T.ID, T.[Name], T.ParentID, R.rlevel + 1 FROM #t T JOIN rCTE R ON T.ParentID = R.ID)SELECT *FROM rCTE