【问题标题】:Get top level parents ID inherit to all children in SQL获取顶级父母 ID 继承给 SQL 中的所有孩子
【发布时间】:2019-09-19 06:21:08
【问题描述】:

我有一张这样的桌子

ID    Name     Parent    Code
----------------------------------
1     Item1     NULL     K123
2     Item2     NULL     K324
3     Item3      1       NULL
4     Item4      2       NULL
5     Item5      3       NULL
6     Item6      5       NULL
7     Item7      4       NULL
8     Item8      NULL    K567
9     Item9      8       NULL
10    Item10     NULL    NULL
---------------------------------

我需要像这样从其父级继承代码给所有子级

ID    Name     Parent    Code
----------------------------------
1     Item1     NULL     K123
2     Item2     NULL     K324
3     Item3      1       K123
4     Item4      2       K324
5     Item5      3       K123
6     Item6      5       K123
7     Item7      4       K324
8     Item8      NULL    K567
9     Item9      8       K567
10    Item10     NULL    NULL
---------------------------------

我尝试了下面的 CTE

;with CTE(ID,Name,Parent,Code,[Level]) as
(
    select ID,Name,Parent,Code,0 as [Level] from tbl_mytable 
    union all
    select T.ID,T.Name,T.Parent,T.Code,C.[Level]+1 from tbl_mytable T
    inner join CTE C on C.Parent=T.ID
)
select * from CTE C

这并不能帮助我实现我正在尝试的目标。我只是 CTE 的初学者,我认为它无法解决。

【问题讨论】:

    标签: sql sql-server-2012 common-table-expression


    【解决方案1】:

    您在使用递归 CTE 的正确轨道上,但您的逻辑有点偏离。考虑这个工作版本:

    WITH cte AS (
        SELECT * FROM tbl_mytable WHERE Parent IS NULL
        UNION ALL
        SELECT t1.ID, t1.Name, t1.Parent, COALESCE(t1.Code, t2.Code)
        FROM tbl_mytable t1
        INNER JOIN cte t2
            ON t1.Parent = t2.ID
    )
    
    SELECT *
    FROM cte
    ORDER BY ID;
    

    Demo

    递归 CTE 的基本案例组件(即联合之前的内容)应该是那些没有父项的记录。这就是我们知道他们是最高父级的方式。然后,我们通过将给定级别与紧接其上的父级匹配来递归地加入 CTE。然后,我们使用一个技巧将代码从顶层拉下来:

    COALESCE(t1.Code, t2.Code)
    

    这将从父代码之一开始,然后向下传播到各个级别的子代码。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-19
      • 2021-12-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多