【问题标题】:How to expand parent-child hierarchy recursively using CTE如何使用 CTE 递归扩展父子层次结构
【发布时间】:2019-10-16 19:40:09
【问题描述】:

我正在尝试使用 Azure SQL 数据库中的 CTE 扩展自引用表,但尚未使其工作。

源表有Id,ParentId列,例如:

Id    ParentId
1     NULL
2     1
3     2
4     2
5     4
6     4
7     NULL
8     7

我想要的结果是这样的:(每个 id 的一行,它是孩子或孙子或...)

Id    ChildId
1     1
1     2
1     3
1     4
1     5
1     6
2     2
2     3
2     4
2     5
2     6
3     3
4     4
4     5
4     6
5     5
6     6
7     7
7     8
8     8

有什么方法可以使用 CTE 或 SQL 表值函数来做到这一点?

【问题讨论】:

  • 由于 Azure SQL 数据库与 SQL Server 兼容,因此我还包含了 SQL Server 标记..

标签: sql sql-server azure-sql-database common-table-expression


【解决方案1】:

为此,您需要一个递归 CTE:

with cte as (
      select id, id as childid, 1 as lev
      from t
      -- where parentid is null
      union all
      select cte.id, t.id, lev + 1
      from cte join
           t
           on cte.childid = t.parentid
      where lev < 10 and t.id <> cte.id
     )
select id, childid
from cte
order by id, childid;

Here 是一个 dbfiddle。

【讨论】:

    【解决方案2】:

    https://docs.microsoft.com/en-us/sql/t-sql/queries/with-common-table-expression-transact-sql?view=sql-server-ver15

    我将使用上面链接中的示例代码作为起点。这个 sn-p 代码依赖于流行的 AdventureWorks 数据库。

    F.使用递归公用表表达式显示分层列表

    USE AdventureWorks2012;  
    GO  
    WITH DirectReports(Name, Title, EmployeeID, EmployeeLevel, Sort)  
    AS (SELECT CONVERT(varchar(255), e.FirstName + ' ' + e.LastName),  
            e.Title,  
            e.EmployeeID,  
            1,  
            CONVERT(varchar(255), e.FirstName + ' ' + e.LastName)  
        FROM dbo.MyEmployees AS e  
        WHERE e.ManagerID IS NULL  
        UNION ALL  
        SELECT CONVERT(varchar(255), REPLICATE ('|    ' , EmployeeLevel) +  
            e.FirstName + ' ' + e.LastName),  
            e.Title,  
            e.EmployeeID,  
            EmployeeLevel + 1,  
            CONVERT (varchar(255), RTRIM(Sort) + '|    ' + FirstName + ' ' +   
                     LastName)  
        FROM dbo.MyEmployees AS e  
        JOIN DirectReports AS d ON e.ManagerID = d.EmployeeID  
        )  
    SELECT EmployeeID, Name, Title, EmployeeLevel  
    FROM DirectReports   
    ORDER BY Sort;
    

    AdventureWorks 架构

    可以从这里获得 Visio ER 图 https://www.microsoft.com/en-us/download/confirmation.aspx?id=10331

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-07-04
      • 2023-03-24
      • 1970-01-01
      • 2015-09-07
      • 2017-03-08
      • 1970-01-01
      • 1970-01-01
      • 2013-11-07
      相关资源
      最近更新 更多