【问题标题】:SQL Server statement to get children using parent id - refactor使用父 ID 获取子代的 SQL Server 语句 - 重构
【发布时间】:2015-11-25 15:17:19
【问题描述】:

我有一个表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

预期结果示例:

【问题讨论】:

标签: sql sql-server


【解决方案1】:

试试这个 -

;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)

【讨论】:

  • 返回的值比预期的多,但对我来说似乎是一个很好的基础
  • 请提供一个预期结果的小例子
  • 请检查查询。抱歉 :) 没有水晶球
  • 我现在发布了正确的预期结果。对此感到抱歉
  • 太棒了。祝你有美好的一天:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-07-26
  • 1970-01-01
  • 1970-01-01
  • 2012-03-17
  • 2014-08-06
  • 2013-03-12
  • 1970-01-01
相关资源
最近更新 更多