【问题标题】:Unable to find the matching child record using recursive CTE无法使用递归 CTE 找到匹配的子记录
【发布时间】:2012-06-26 11:11:23
【问题描述】:

我有下表@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

请帮忙

【问题讨论】:

    标签: sql-server-2008 recursive-cte


    【解决方案1】:

    问题在于第二个 UNION 查询中的 JOIN。您正在加入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);
    

    【讨论】:

      猜你喜欢
      • 2011-04-25
      • 1970-01-01
      • 1970-01-01
      • 2018-08-21
      • 2011-10-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多