0

我有下表@t:

ParentId   SkuName  ChildId
   P1         X1      C1
   C1         X2      C2
   C2         X3      C2

如果我通过 ParentId = P1,则所需的输出是 x3

即停止条件是匹配记录的最后一行并获取该记录的 sku 名称

排。如果没有匹配的行,则返回 null

我的尝试(虽然没有工作)

DECLARE @t TABLE (ParentId Varchar(100), Name VARCHAR(20), ChildId Varchar(100))
INSERT INTO @t(ParentId, Name, ChildId)
  SELECT 'P1', 'X1', 'C1' UNION ALL
  SELECT 'C1', 'X2', 'C2' UNION ALL
  SELECT 'C2', 'X3', 'C2' 

Declare @ParentId Varchar(10) = 'P1'

;With CTE As
(
    Select 
        Rn = ROW_NUMBER() Over(Order By (Select 1))
        ,ParentId
        , Name
        , ChildId
    From @t Where ParentId = @ParentId

    Union All

    Select 
        Rn + 1
        ,pc.ParentId as Parents     
        ,pc.Name
        ,pc.ChildId
    FROM @t pc
    JOIN CTE gp on pc.Childid = gp.Parentid
)

Select *
From CTE

请帮忙

4

1 回答 1

0

问题出JOIN在您的第二个UNION查询中。你正在加入pc.Childid = gp.Parentid。你应该加入pc.ParentId = gp.Childid

此外,由于您的数据的子项和父项具有相同的值,因此您最终将获得无限递归,除非您指定递归应该在ParentId等于Childid. ( WHERE gp.ParentId <> gp.Childid)

这是您正在寻找的结果吗?

DECLARE @t TABLE (ParentId VARCHAR(100), Name VARCHAR(20), ChildId VARCHAR(100))
INSERT INTO @t(ParentId, Name, ChildId)
SELECT 'P1', 'X1', 'C1' UNION ALL
SELECT 'C1', 'X2', 'C2' UNION ALL
SELECT 'C2', 'X3', 'C2' 

DECLARE @ParentId VARCHAR(10) = 'P1'

;With CTE As
(
    SELECT 
        Rn = 1
        ,ParentId
        ,Name
        ,ChildId
    FROM @t WHERE ParentId = @ParentId

    UNION All

    SELECT 
        Rn + 1
        ,pc.ParentId as Parents     
        ,pc.Name
        ,pc.ChildId
    FROM @t pc
    JOIN CTE gp 
        on pc.ParentId = gp.Childid
    WHERE gp.ParentId <> gp.Childid
)

SELECT TOP 1 *
FROM CTE
ORDER BY Rn DESC
OPTION (MAXRECURSION 0);
于 2012-06-26T11:25:21.430 回答