Получить родителей / детей, где родительские номера не всегда совпадают - PullRequest
0 голосов
/ 16 февраля 2020

У меня проблема с тем, что все связанные элементы сворачиваются в один набор результатов.

В этом случае у нас есть мастер ParentPart (901359) с компонентами, которые связаны между собой. У нас также могут быть компоненты, которые являются родительской частью (340804, 340801, 340850)

Ниже приведены данные, с которыми я имею дело

ParentPart  Component
---------------------
901359      340804
340804      340801
340801      340850
340850      333000

Что я хочу получить, так это этот результат, или чтобы собрать все связанные компоненты

ParentPart  Component
----------------------
901359      340804
901359      340801
901359      340850
901359      333000

Ниже приведен код для тестирования.

CREATE TABLE #Hierarchy 
(
    ParentPart VARCHAR(15),
    Component VARCHAR(15)
)

INSERT INTO #Hierarchy (ParentPart, Component)
VALUES 
  ('901359','340804'),
  ('340804','340801'),
  ('340801','340850'),
  ('340850','333000')

 SELECT *
 FROM #Hierarchy

 DROP TABLE #Hierarchy

Я пробовал рекурсивный CTE, но это не не дает мне результат, который я ищу, так как родительские части не все одинаковы.

Есть указатели?

Ответы [ 2 ]

2 голосов
/ 16 февраля 2020

Это типичный рекурсивный запрос. В этом случае вы можете пройтись по дереву сверху вниз:

with cte as (
    select parentpart, component, 1 lvl  from #Hierarchy
    union all
    select c.parentpart, h.component, lvl + 1
    from cte c
    inner join #Hierarchy h on h.parentpart = c.component
)
select parentpart, component
from cte c 
where c.lvl = (select max(c1.lvl) from cte c1 where c1.component = c.component)

Рекурсивное выражение общей таблицы генерирует пути к дереву, отслеживая уровень каждого узла; затем внешние запросы фильтруют по верхнему родительскому элементу для каждого узла.

Демонстрация по DB Fiddle :

parentpart | component
:--------- | :--------
901359     | 340804   
901359     | 340801   
901359     | 340850   
901359     | 333000   
1 голос
/ 16 февраля 2020

Следующая рекурсивная CTE сделает работу:

with hier as (
select ParentPart as MainPart, ParentPart, Component from #Heirarchy
union all
select hier.MainPart, p.ParentPart, p.Component 
from hier 
join #Heirarchy as p
on p.ParentPart = hier.Component 
)
select MainPart, Component from hier where MainPart = '901359';
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...