我正在尝试进行一个查询,使我可以将儿童级别提升为层次表,但没有结果。 在示例表下方:
我想应用的解决方案是,如果孩子是以“ 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
然后应用更新
答案 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