在层次结构中找到最高的父级

问题描述 投票:0回答:1

我有一个SQL表,上面有不同的项目代码。一个项目可以由多个层次(子项目)组成。我想使用SQL编码找到每个项目代码的最高级别(最高父级)。

我的表是这样的。

CREATE TABLE #Temp
(
    Child nvarchar(100),
    Parent nvarchar(100)

)

insert into #Temp (Child,Parent)
values
('17210',Null),
('17210-100','17210'),
('17210-100-100','17210-100'),
('1310',Null),
('1310-100','1310'),
('1310-100-100','1310-100')
;

select * from #Temp

If(OBJECT_ID('tempdb..#temp') Is Not Null)
Begin
    Drop Table #Temp
End

这就是我想要的结果

Child           Parent      TopParent
17210           NULL        17210
17210-100       17210       17210
17210-100-100   17210-100   17210
1310            NULL        1310
1310-100        1310        1310
1310-100-100    1310-100    1310

我如何找到每个项目编号(子项目)的顶层父级?我有一个想法,使用递归CTE可能是解决方案,但我不确定这是否是正确的方法。

任何帮助都是非常感激的。

sql-server common-table-expression recursive-query
1个回答
0
投票

我真的不知道这和其他递归cte问题有什么不同,但既然你已经做了这么好的工作,以DDL+DML的形式发布样本数据,我还是决定回答这个问题(尽管它可以像重复一样容易关闭)。

正如你写的那样,使用递归的cte是这里的解决方案。

WITH cte AS 
(
    SELECT Child, Parent, Child As TopParent
    FROM #Temp
    WHERE Parent IS NULL
    UNION ALL
    SELECT T.Child, T.Parent, cte.TopParent
    FROM #Temp As T
    JOIN cte 
        ON T.Parent = cte.Child
)

SELECT *
FROM cte
ORDER BY TopParent DESC, Parent;

2
投票

这个问题类似于用sql语言遍历一棵树. 我认为你可能需要使用存储过程来解决这个问题.首先,查询所有记录。当遍历一条记录时,通过while循环找到最上面的父记录,但是,需要考虑非法数据。例如,('1','2'),('2','3')和('3','1')会导致while循环变成一个无限循环。


1
投票

试试这个。

CREATE TABLE Category
(
    Child nvarchar(100),
    Parent nvarchar(100)

)

insert into Category (Child,Parent)
values
('17210',Null),
('17210-100','17210'),
('17210-100-100','17210-100'),
('1310',Null),
('1310-100','1310'),
('1310-100-100','1310-100')
;

With cte (Child , Parent, LevelID, topparent)
as
(
    --Anchor
    Select Child , Parent ,0 as LevelID , Child AS TopParent
    From Category
    Where Parent is Null

    Union All

    Select c.Child , c.Parent , cte.LevelID - 1 , cte.TopParent
    From Category c inner join  cte On cte.Child=c.Parent
)

Select c.Child , c.Parent ,cte.TopParent
        From cte

你可以使用 CTE 递归查询,并为父母找到顶层ID,就像上面的查询一样,这个模型非常快速和有用。

希望您能在此祝愿

© www.soinside.com 2019 - 2024. All rights reserved.