2017-03-12 3 views
0

나는 "으로부터 1을 선택하면 (활동으로 대체 활동)이SQL 서버 무제한 가입/가입?

Activity | ActivityId 
Skiing |  1 
Swimming |  2 
climbing |  3 

그리고이 같은 같은 두 개의 테이블이 예에서

ActivityId | ShouldBeReplacedWithActivityId 
    1  |   2 
    2  |   3 

내가 최종 결과는 3되고 싶어해야 활동이 활동으로 대체 됨 "테이블. 우리가 1로 시작하고이 활동이 2로 바뀌기 때문입니다. 그러나 2도 3으로 대체됩니다.

활동 수는 무제한이며 "활동으로 바뀐 활동" 이 작업을 수행 할 수있는 방법이 있습니까? 저장 프로 시저/함수를 사용하지 않고? 이 쿼리로 뷰를 생성 할 수 있어야합니다 (결과는 다른 데이터와의 조인에서 사용할 수 있습니다).

이 예제는 도움이 필요한 것을 설명하기 위해 단순화되었습니다. 이 솔루션은 새로운 테이블의 작성 포함/또는 당신은 재귀 CTE 찾고있는 기존 솔루션

답변

1

와 함께 사용할 수 있기 때문에 데이터 구조를 변경하지 마십시오 :

with cte as (
     select ShouldBeReplacedWithActivityId as activityId, 1 as lev 
     from table2 
     where activityId = 1 
     union all 
     select t.ShouldBeReplacedWithActivityId, cte.lev + 1 
     from cte join 
      table2 t 
      on cte.activityId = t.activityId 
    ) 
select top 1 cte.* 
from cte 
order by lev desc; 

너무 많은 활동이있을 경우, max recursion 옵션을 설정해야합니다. 또한 활동의주기에주의해야합니다.

+0

감사합니다. 나는 이것으로 테스트 할 것이다 : –

+0

어디에서 t 정의/무엇입니까? –

+0

't'는 원래 질문에 게시 한 데이터가있는 테이블이 될 것입니다. 이 쿼리는 테이블을 참조하지 않고 어떻게 동작 할 것이라고 생각하십니까? –