SQL Promote child в иерархической структуре - PullRequest
0 голосов
/ 27 июня 2019

Я пытаюсь сделать запрос, который позволяет мне повысить уровень детей в иерархической таблице, но безрезультатно. под таблицей примеров:

enter image description here

решение, которое я хотел бы применить, состоит в том, что если ребенок является потомком кода, начинающегося с «NO_», он должен быть связан с отцом более высокого уровня, который не начинается с «NO_». Пример:

enter image description here

Я пробовал некоторые решения, такие как использование cte или update из join, без получения результата, и могу ли я получить поддержку?

ТНХ

обновление 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 Ответ

1 голос
/ 28 июня 2019

Вам необходимо использовать рекурсив 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...