Your sample data doesn't match up to your query. If you can supply proper data, I',m sure we can help. Untill then here a CTE for your first table:DECLARE @tbl_Pages TABLE(PageID INT, ParentID INT, Name VARCHAR(50))INSERT @tbl_PagesSELECT 0 , null , 'home'UNION ALL SELECT 1 , 0 , 'page a'UNION ALL SELECT 2 , 1 , 'page a child'UNION ALL SELECT 3 , 0 , 'page b'DECLARE @tbl_Pages_Images TABLE (QuoteID INT, PageID INT, QuoteText VARCHAR(50))INSERT @tbl_Pages_ImagesSELECT 1 , 0 , 'quote one'UNION ALL SELECT 2 , 3 , 'quote two';With CTE (PageID, ParentID, Name, PageLevel)AS( SELECT a.PageID, a.ParentID, a.Name, 0 AS PageLevel FROM @tbl_Pages a WHERE ParentID IS NULLUNION ALL SELECT a.PageID, a.ParentID, a.Name, PageLevel + 1 FROM @tbl_Pages a INNER JOIN CTE AS C ON a.ParentID = c.PageID)SELECT * FROM CTE-- This will get you quotes on a page:SELECT * FROM CTE AS CLEFT OUTER JOIN @tbl_Pages_Images AS T ON C.PageID = T.PageId