SQL 父子 - 主父
SQL Parent Child - Master Parent
我需要确定许多链接子代码的主父代码,但我一直收到最大递归错误。我还是 SQL 的新手,有人可以帮我解决这个问题吗?
理想情况下,我希望最终结果看起来像这样:
我一直在玩的代码如下所示:
WITH Hierarchy(Code, Previous_Code, Master_Parent)
AS
(
SELECT CAST(Code AS VARCHAR(MAX)), CAST(Previous_Code AS VARCHAR(MAX)), CAST('' AS VARCHAR(MAX))
FROM Test AS LastGeneration
WHERE CAST(Code AS VARCHAR(MAX)) NOT IN (SELECT COALESCE(CAST(Previous_Code AS VARCHAR(MAX)), '0') FROM Test)
UNION ALL
SELECT CAST(PrevGeneration.Code AS VARCHAR(MAX)), CAST(PrevGeneration.Previous_Code AS VARCHAR(MAX)),
CAST(CASE WHEN Child.Previous = ''
THEN(CAST(Child.Code AS VARCHAR(MAX)))
ELSE(Child.Previous + '.' + CAST(Child.Code AS VARCHAR(MAX)))
END AS VARCHAR(MAX))
FROM Test AS PrevGeneration
INNER JOIN Hierarchy AS Child ON PrevGeneration.Code = Child.Previous_Code
)
SELECT *
FROM Hierarchy
OPTION(MAXRECURSION 32767)
Declare @YourTable table (Code varchar(25),Previous_Code varchar(25))
Insert into @YourTable values
('AA2016', 'AA2015')
,('AA2015', 'AA2014')
,('AA2014', 'AA2013')
,('AA2013', null),
('BB2016', 'BB2015')
,('BB2015', 'BB2014')
,('BB2014', 'BB2013')
,('BB2013', null),
('CC2016', 'CC2015')
,('CC2015', 'CC2014')
,('CC2014', 'CC2013')
,('CC2013', null)
;with cteP as (
Select Code
,Previous_Code
,Master_Parent = Code
,Master_Parent_History = cast(Code as varchar(200))
From @YourTable
Where Previous_Code is Null
Union All
Select r.Code
,r.Previous_Code
,p.Master_Parent
,cast(r.Code+','+p.Master_Parent_History as varchar(200))
From @YourTable r
Join cteP p on r.Previous_Code = p.Code)
Select Code
,Previous_Code
,Master_Parent
,Master_Parent_History = case when Master_Parent_History=Code then null else replace(Master_Parent_History,Code+',','') end
From cteP
Order By Left(Code,1), Code Desc
Returns
我需要确定许多链接子代码的主父代码,但我一直收到最大递归错误。我还是 SQL 的新手,有人可以帮我解决这个问题吗?
理想情况下,我希望最终结果看起来像这样:
我一直在玩的代码如下所示:
WITH Hierarchy(Code, Previous_Code, Master_Parent)
AS
(
SELECT CAST(Code AS VARCHAR(MAX)), CAST(Previous_Code AS VARCHAR(MAX)), CAST('' AS VARCHAR(MAX))
FROM Test AS LastGeneration
WHERE CAST(Code AS VARCHAR(MAX)) NOT IN (SELECT COALESCE(CAST(Previous_Code AS VARCHAR(MAX)), '0') FROM Test)
UNION ALL
SELECT CAST(PrevGeneration.Code AS VARCHAR(MAX)), CAST(PrevGeneration.Previous_Code AS VARCHAR(MAX)),
CAST(CASE WHEN Child.Previous = ''
THEN(CAST(Child.Code AS VARCHAR(MAX)))
ELSE(Child.Previous + '.' + CAST(Child.Code AS VARCHAR(MAX)))
END AS VARCHAR(MAX))
FROM Test AS PrevGeneration
INNER JOIN Hierarchy AS Child ON PrevGeneration.Code = Child.Previous_Code
)
SELECT *
FROM Hierarchy
OPTION(MAXRECURSION 32767)
Declare @YourTable table (Code varchar(25),Previous_Code varchar(25))
Insert into @YourTable values
('AA2016', 'AA2015')
,('AA2015', 'AA2014')
,('AA2014', 'AA2013')
,('AA2013', null),
('BB2016', 'BB2015')
,('BB2015', 'BB2014')
,('BB2014', 'BB2013')
,('BB2013', null),
('CC2016', 'CC2015')
,('CC2015', 'CC2014')
,('CC2014', 'CC2013')
,('CC2013', null)
;with cteP as (
Select Code
,Previous_Code
,Master_Parent = Code
,Master_Parent_History = cast(Code as varchar(200))
From @YourTable
Where Previous_Code is Null
Union All
Select r.Code
,r.Previous_Code
,p.Master_Parent
,cast(r.Code+','+p.Master_Parent_History as varchar(200))
From @YourTable r
Join cteP p on r.Previous_Code = p.Code)
Select Code
,Previous_Code
,Master_Parent
,Master_Parent_History = case when Master_Parent_History=Code then null else replace(Master_Parent_History,Code+',','') end
From cteP
Order By Left(Code,1), Code Desc
Returns