使用父ID的SQL Server语句 - 重构器

时间:2015-11-25 15:17:20

标签: sql sql-server

我有一个表content_folder_tbl,其中包含使用folder_idparent_id定义的所有文件夹和子文件夹的列表

我希望在定义根folder_id后获取所有文件夹ID。

作为一种解决方法,我提出了这个问题:

 select * 
 from content_folder_tbl 
 where folder_id in (select folder_id 
                     from content_folder_tbl 
                     where parent_id = 73 
                     UNION
                     Select folder_id 
                     from content_folder_tbl 
                     where parent_id in (select folder_id 
                                         from content_folder_tbl 
                                         where parent_id = 73)
                     Union
                     Select folder_id 
                     from content_folder_tbl 
                     where parent_id in (Select folder_id 
                                         from content_folder_tbl 
                                         where parent_id in (select folder_id
                                                             from content_folder_tbl 
                                                             where parent_id = 73))
  )

它完全返回我想要的内容,但它是多余的,仅当我有3个级别的文件夹时才有效。

如何重写此查询以返回任何级别的值(看起来我需要一个递归方法)?

在这种情况下,

73是根folder_id

预期结果的示例:

enter image description here

1 个答案:

答案 0 :(得分:3)

尝试这个 -

;WITH cte AS
(
    SELECT *
    FROM dbo.content_folder_tbl
    WHERE folder_id = 73

    UNION ALL

    SELECT t2.*
    FROM cte t1
    JOIN dbo.content_folder_tbl t2 ON t1.folder_id = t2.parent_id
)
SELECT *
FROM cte
OPTION (MAXRECURSION 0)