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、2 番目の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 に答える