【问题标题】:T-SQL / SQL Server - How to recursively select all nested children IDs of a given parent? [duplicate]T-SQL / SQL Server - 如何递归选择给定父级的所有嵌套子级 ID? [复制]
【发布时间】:2017-11-15 11:51:19
【问题描述】:

考虑下表和层次结构:

如果我有父 ID 10011,我如何选择所有子 ID (10012, 10013, 10014)(优雅而高效)?

这里ParentId 自己引用了一个父文件夹。

【问题讨论】:

标签: sql-server tsql


【解决方案1】:

使用递归cte

;WITH cte 
AS
(   SELECT
        b.FolderId, b.FolderName, b.ParentiD
    FROM
        table b
    WHERE
        FolderId= 10011
    UNION ALL
    SELECT
        e.FolderId, e.FolderName, e.ParentId
    FROM
        table  e
    INNER JOIN
        cte r ON e.ParentId = r.FodlerId
)
SELECT * FROM cte

【讨论】:

    【解决方案2】:

    试试这个:

    DECLARE @DataSource TABLE
    (
        [FolderID] INT
       ,[FolderName] VARCHAR(12)
       ,[ParentID] INT
    );
    
    INSERT INTO @DataSource ([FolderID], [FolderName], [ParentID])
    VALUES (10011, 'NEw Folder', NULL)
          ,(10012, 'NEw Folder', 10011)
          ,(10013, 'NEw Folder', 10012)
          ,(10014, 'NEw Folder', 10013)
          ,(10021, 'NEw Folder', NULL)
          ,(10022, 'NEw Folder', 10021)
          ,(10023, 'NEw Folder', 10022);
    
    DECLARE @ParentID INT = 10011;
    
    WITH DataSource AS
    (
        SELECT *
        FROM @DataSource
        WHERE [FolderID] = @ParentID
        UNION ALL
        SELECT A.*
        FROM DataSource R
        INNER JOIN @DataSource A
            ON R.[FolderID] = A.[ParentID]
    )     
    SELECT DISTINCT [FolderID]
    FROM DataSource
    WHERE [FolderID] <> @ParentID;
    

    【讨论】:

      【解决方案3】:

      简单的自我加入会帮助你

      select e.folderid from table1 e inner join table1 t on e.parentid = t.folderid where t.parentid = 10011
      

      试试上面的查询:)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-02-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-01-31
        相关资源
        最近更新 更多