我有一个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可能是解决方案,但我不确定这是否是正确的方法。
任何帮助都是非常感激的。
我真的不知道这和其他递归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;
这个问题类似于用sql语言遍历一棵树. 我认为你可能需要使用存储过程来解决这个问题.首先,查询所有记录。当遍历一条记录时,通过while循环找到最上面的父记录,但是,需要考虑非法数据。例如,('1','2'),('2','3')和('3','1')会导致while循环变成一个无限循环。
试试这个。
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,就像上面的查询一样,这个模型非常快速和有用。
希望您能在此祝愿