SQL升级子级结构

时间:2019-06-27 15:47:38

标签: sql sql-server tsql

我正在尝试进行一个查询,使我可以将儿童级别提升为层次表,但没有结果。 在示例表下方:

enter image description here

我想应用的解决方案是,如果孩子是以“ NO_”开头的代码的孩子,则必须将他们链接到不是以“ NO_”开头的高级父亲。 例如:

enter image description here

我尝试了一些解决方案,例如使用cte或从join更新,但没有得到结果,我可以得到支持吗?

thx

更新1

删除/替换列是img上的注释, 我一直在尝试应用这样的解决方案:

WITH CHILD (PARENT,CHILD)
AS
(select B.PARENT,B.CHILD
from BOM B
where B.CHILD like 'NO_%')

Select * from CHILD


WITH PARENT (PARENT,CHILD)
AS
(SELECT B.PARENT,B.CHILD
    FROM BOM B
    where B.PARENT like 'NO_%')

select * from PARENT

然后应用更新

1 个答案:

答案 0 :(得分:1)

您需要使用CTE递归来标识“新父代”。首先,选择父母为“ NO_”的非“ NO_”个孩子。从他们那里,您必须向上移动层次结构,直到找到非“ NO_”父对象。为此,我使用了额外的列NEW_PARENT_FOUND。

这里是查询,可以轻松转换为更新。

<!-- language: lang-sql -->
declare @vBOM table (PARENT varchar(20), CHILD varchar(20))
insert into @vBOM( PARENT, CHILD )
values
    ('C002584', 'NO_CRT874')
    , ('NO_CRT874', 'F8745')
    , ('NO_CRT874', 'IY845')
    , ('NO_CRT874', 'YRF522')
    , ('C002584', 'NO_UYTRR')
    , ('NO_UYTRR', 'NO_UYT953')
    , ('NO_UYT953', 'FEWF845')
    , ('C002584', '95659I')
    , ('C002584', '84666E')


; with cteNewParent as
    (select B.CHILD, B.PARENT NEW_PARENT, 0 NEW_PARENT_FOUND 
    from @vBOM B 
    where B.CHILD not like 'NO_%' and B.PARENT like 'NO_%'
    union all
    select NP.CHILD, B.PARENT NEW_PARENT, iif(NP.CHILD not like 'NO_%' and B.PARENT not like 'NO_%', 1, 0) NEW_PARENT_FOUND
    from cteNewParent NP inner join @vBOM B on B.CHILD = NP.NEW_PARENT
    where NP.NEW_PARENT_FOUND = 0 
    )
select NP.CHILD, NP.NEW_PARENT, NP.NEW_PARENT_FOUND, B.PARENT, B.CHILD
from cteNewParent NP inner join @vBOM B on B.CHILD = NP.CHILD
where NP.NEW_PARENT_FOUND = 1