2016-06-24 2 views
1

노드의 모든 부모를 찾는 일반적인 CTE의 변형입니다. 차이는 다음과 같습니다.공통 테이블 표현식 여기서 두 열에는 루트가 없습니다.

  • 가장 큰 하위 항목에는 null 아이가 없습니다. 대신, 이것은 단순히 child 열에 없습니다. 이 경우

    insert into t (parent, child) values (1, 2) 
    insert into t (parent, child) values (1, 3) 
    insert into t (parent, child) values (4, 2) 
    insert into t (parent, child) values (2, 5) 
    insert into t (parent, child) values (2, 6) 
    insert into t (parent, child) values (9, 6) 
    insert into t (parent, child) values (6, 7) 
    insert into t (parent, child) values (6, 8) 
    
    with cte as 
    ( 
        select child, parent, 0 as level 
        from t 
        where parent = 5 
        union all 
        select q.child, q.parent, level+1 
        from t q 
        inner join cte as c on c.parent= q.child 
    ) 
    
    select distinct parent from cte 
    where parent <> 5 
    

    , 내가 5에 대한 모든 부모를 얻을 때 5 사람에 부모가 아니기 때문에, 아무 것도 발견되지 :

여기 내 시도이다. 2에 대한 부모를 모두 찾으면 256의 부모이므로 성공합니다.

+0

. 2 및 6은 아이들처럼 두 번 나열됩니다. 심지어 복사/붙여 넣기 오류라고 생각하는 필드 이름을 전환했습니다. 귀하의 cte는 계층 구조를 buld 것입니다, 당신은 결과를 좋아하지 않을 수도 있습니다 6 가장 큰 인구가 –

+0

나는 그것이 나무라고 결코. 아이가 여러 부모를 가질 수 없거나 부모가 여러 자녀를 가질 수 없다고 말하는 것은 없습니다. – jiaweizhang

+0

무료/임시 방편 인 경우 괜찮습니다. 자녀가 여러 명의 부모를 가질 수 있다는 데 동의합니다 (즉, 보고서는 위험 분석 및 분기 별 결과에 속할 수 있음). 그렇다면 왜 그 질문입니까? 분명히 5는 부모가 아닙니다. –

답변

2

5이 누구의 부모도 아닌 경우 필터 parent=5은 결코 출력을 제공하지 않습니다. 5child 그리고 당신은 그 위에 모든 부모를 찾으려면 :이 가능한 계층없는

declare @t table (parent int, child int) 

insert into @t (parent, child) 
values (1, 2), 
(1, 3), 
(4, 2), 
(2, 5), 
(2, 6), 
(9, 6), 
(6, 7), 
(6, 8) 

;with cte as 
( 
    select child, parent, 0 as level 
    from @t 
    where child = 5 ---<<< 
    union all 
    select q.child, q.parent, level+1 
    from @t q 
    inner join cte as c on c.parent= q.child 
) 

select distinct parent from cte 
where parent <> 5 

enter image description here

+0

아. 감사. 그건 정말 바보 같았 어. '부모 '를'자식'으로 바꿨고 효과가있었습니다. – jiaweizhang