首页 > 解决方案 > 获取父编号不总是匹配的父/子

问题描述

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

在本例中,我们有一个主控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,但它并没有给我我正在寻找的结果,因为父部分并不完全相同。

任何指针?

标签: sqlsql-servertsqlsql-server-2016recursive-query

解决方案


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

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 上的演示

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

推荐阅读