A slightly different way, including all columns at the end
;WITH q AS ( SELECT ft.folder_id FROM File_Table ft INNER JOIN Folder_Table f ON f.folder_id = ft.folder_id UNION ALL SELECT f.parent_id FROM Folder_Table f INNER JOIN q ON q.folder_id = f.folder_id ) SELECT DISTINCT f.folder_id , f.parent_id , f.folder_name , f.is_active FROM q INNER JOIN Folder_Table f ON f.folder_id = q.folder_id WHERE f.is_active = 1
Test script
;WITH Folder_Table (folder_id, parent_id, folder_name, is_active) AS ( SELECT * FROM (VALUES (1, 0, 'Folder1', 1) , (2, 1, 'Folder2', 0) , (3, 1, 'Folder3', 1) , (4, 2, 'Folder4', 0) , (5, 2, 'Folder5', 0) , (6, 3, 'Folder6', 1) , (7, 6, 'Folder7', 1) , (8, 0, 'Folder8', 1) , (9, 8, 'Folder9', 1) , (10, 8, 'Folder10', 1) ) a (b, c, d, e) ) , File_Table (filed_id, folder_id, file_name) AS ( SELECT * FROM (VALUES (1, 4, 'File1') , (2, 4, 'File2') , (3, 5, 'File3') , (4, 5, 'File4') , (5, 9, 'File5') , (6, 10, 'File6') ) a (b, c, d) ) , q AS ( SELECT ft.folder_id FROM File_Table ft INNER JOIN Folder_Table f ON f.folder_id = ft.folder_id UNION ALL SELECT f.parent_id FROM Folder_Table f INNER JOIN q ON q.folder_id = f.folder_id ) SELECT DISTINCT f.folder_id , f.parent_id , f.folder_name , f.is_active FROM q INNER JOIN Folder_Table f ON f.folder_id = q.folder_id WHERE f.is_active = 1