Sql 在父子关系中添加到行而不是列

Sql 在父子关系中添加到行而不是列,sql,sql-server,Sql,Sql Server,这是补充材料清单结构数据。 有父父部件,然后组件和每个组件也可以使用其他组件 现在使用LEFT JOIN,我可以添加列,但我想知道如何将其作为只有2列的列,并具有ParentPart和所有组件 所以它看起来像: 父母部分 组成部分 WN3403 NF0533K WN3403 571012 ... ... 最简单的解决方案是使用6个数字和条件列创建,如下所示: with cte (num) as (select 1 union all select num+1 from cte where num

这是补充材料清单结构数据。 有父父部件,然后组件和每个组件也可以使用其他组件

现在使用LEFT JOIN,我可以添加列,但我想知道如何将其作为只有2列的列,并具有ParentPart和所有组件

所以它看起来像:

父母部分 组成部分 WN3403 NF0533K WN3403 571012 ... ...
最简单的解决方案是使用6个数字和条件列创建,如下所示:

with cte (num) as
(select 1 union all
select num+1 from cte where num <= 6),
your_query as (<put_your_query_here>)
select t.parent_part,
       case when c.num = 1 then level_1_component,
            when c.num = 2 then level_2_component,
            when c.num = 3 then level_3_component,
            when c.num = 4 then level_4_component,
            when c.num = 5 then level_5_component,
            when c.num = 6 then level_6_component
        end as component
   from cte c cross join your_query t

如果我理解正确的话,您希望取消打印数据

使用和应用:

我建议添加其他列,例如级别和直接父级:

select v.*
from t cross apply
     (values (parent_part, level_1_component, NULL, 1),
             (parent_part, level_2_component, level_1_component, 2),
             (parent_part, level_3_component, level_2_component, 3),
             (parent_part, level_4_component, level_3_component, 4),
             (parent_part, level_5_component, level_4_component, 5),
             (parent_part, level_6_component, level_5_component, 6)
     ) v(parent_part, component, parent_component, lev)
where component is not null;
         

请不要为你几乎无法阅读的数据/代码发布这样的海量图像。相反,以格式化文本的形式发布,这样更易于阅读和复制+粘贴。
select v.*
from t cross apply
     (values (parent_part, level_1_component, NULL, 1),
             (parent_part, level_2_component, level_1_component, 2),
             (parent_part, level_3_component, level_2_component, 3),
             (parent_part, level_4_component, level_3_component, 4),
             (parent_part, level_5_component, level_4_component, 5),
             (parent_part, level_6_component, level_5_component, 6)
     ) v(parent_part, component, parent_component, lev)
where component is not null;