【问题标题】:Get parent/children where parent numbers don't always match获取父编号不总是匹配的父/子
【发布时间】:2020-02-16 20:14:08
【问题描述】:

我在将所有相关项目汇总到一个结果集中时遇到问题。

在这种情况下,我们有一个主 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,但它并没有给我想要的结果,因为父部分并不完全相同。

任何指针?

【问题讨论】:

  • 这是一个层次结构 - 不是“层次结构” ...

标签: sql sql-server tsql sql-server-2016 recursive-query


【解决方案1】:

这是一个典型的递归查询。在这种情况下,您可以从上到下遍历树:

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)

递归公用表表达式生成树路径,同时跟踪每个节点的级别;然后外部查询过滤每个节点的顶​​级父节点。

Demo on DB Fiddle

父部分 |零件 :--------- | :-------- 901359 | 340804 901359 | 340801 901359 | 340850 901359 | 333000

【讨论】:

    【解决方案2】:

    以下递归 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';
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多