2012-06-26 1 views
0

를 사용하여 일치하는 자식 기록을 찾을 수 없습니다 나는 다음과 같은 테이블 @t이 : 나는 ParentId = P1, 원하는 출력은 X3재귀 CTE

을 전달하는 경우

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

가 정지 상태 인 즉 마지막 행과 일치하는 레코드 및 그 sku 이름을 얻으십시오

행. 어떤 행이 일치하지 않으면,

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 

답변

0

문제는 두 번째 UNION 쿼리에서 JOIN 함께 도와주세요 널

내 시도 (하지만 어떤 작업)을 반환합니다. pc.Childid = gp.Parentid에 가입 중입니다. pc.ParentId = gp.Childid에 가입해야합니다.

ParentIdChildid과 같을 때 재귀가 중지되도록 지정하지 않으면 데이터에 하위 값과 부모 값이 모두 동일한 값으로 저장되므로 무한 재귀로 끝납니다. (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);