SQL在层次结构中提升子级

SQL在层次结构中提升子级,sql,sql-server,tsql,Sql,Sql Server,Tsql,我正在尝试创建一个查询,它允许我将儿童的级别提升为一个层次表,而不会产生任何结果。 下表为示例: 我想应用的解决方案是,如果一个孩子是以“NO”开头的代码的孩子,那么他们必须链接到不以“NO”开头的更高级别的父亲。 例如: 我尝试了一些解决方案,例如使用cte或从join更新,但没有得到结果,我可以得到支持吗 thx 更新1 删除/替换列为img上的注释, 我一直在尝试应用这样的解决方案: WITH CHILD (PARENT,CHILD) AS (select B.PARENT,B.CHILD

我正在尝试创建一个查询,它允许我将儿童的级别提升为一个层次表,而不会产生任何结果。 下表为示例:

我想应用的解决方案是,如果一个孩子是以“NO”开头的代码的孩子,那么他们必须链接到不以“NO”开头的更高级别的父亲。 例如:

我尝试了一些解决方案,例如使用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

然后应用更新

您需要使用CTE递归来识别新的父级。首先,选择父母为“否”的非“否”儿童。从它们开始,您必须在层次结构上向上移动,直到找到一个非“无”父级。为此,我使用了一个额外的列NEW\u PARENT\u 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

分享您所做的尝试。此删除/替换列来自何处?删除/替换列是img上的注释,我一直在尝试应用这样的解决方案:对于子级父级,子级为select B.CODICE_PADRE,B.CODICE_FIGLIO from DBWORKS2IDEALE_BOM B Where B.CODICE_FIGLIO like'NO_%'select*from CHILD WITH PARENT PARENT PARENT,子项作为选择B.PARENT,B.CHILD从DBWORKS2IDEALE_BOM B,其中B.CODICE_PADRE类似于“NO”从父项中选择*,然后应用更新请阅读有关改进问题的一些提示。DDL和可用的样本数据比数据图片更有用。