Sql 在父子关系中添加到行而不是列
这是补充材料清单结构数据。 有父父部件,然后组件和每个组件也可以使用其他组件 现在使用LEFT JOIN,我可以添加列,但我想知道如何将其作为只有2列的列,并具有ParentPart和所有组件 所以它看起来像: 父母部分 组成部分 WN3403 NF0533K WN3403 571012 ... ...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
最简单的解决方案是使用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;