그래프 :TSQL CTE와 같은 구조 및 샘플 데이터의 테이블을 정렬
GetActivities('a')
Order Activities
-------------------
0 a
1 b
2 c
I :
TableActivity
-------------
Type VARCHAR(8)
Activity VARCHAR(8)
RelatedActivity VARCHAR(8)
Type Activity RelatedActivity
------------------------------------------
Start a -
Transfer a b
Start b -
Transfer b c
Start c -
Stop c -
Transfer c b
Stop b -
Transfer b a
Stop a -
CTE 쿼리를 작성할 수 있을까는 다음을 수행 할 재귀 문에서 행을 반환하는 것을 멈추는 데 어려움을 겪고 있습니다.
아이디어가 있으십니까?
편집
은 ('A'를) GetActivities을 명확히합니다. 이 함수는 'a'의 '시작'활동을 찾아 'a'의 '전송'활동을 찾아야합니다. 그 지점에서 함수는 'b'와 그 결과로 샘플 데이터와 함께 'c'를 반복 할 수 있습니다. 쿼리는 '전송'을 통해 'a'와 관련된 모든 활동을 반환해야합니다. 이 중첩 된 활동은 필요한만큼 깊게 갈 수 있고 알 수 없습니다 (그래서 노동 조합이 없음). 내가 가지고있는 어려움은 예를 들어 다른 '전송'이 다시 진행된다는 것입니다. 'b'-> 'a'. 재귀 쿼리에서 이것이 어떻게 생성되는지 볼 수 있습니다.
하나 더 설명 : 활동 표의 전송이 스택으로 작동합니다. 다음은 데이터가 테이블에 채워지는 방법입니다 (C#의 경우) :
using (Activity.Start("a"))
{
// transfer to 'b' under covers
using (Activity.Start("b"))
{
// transfer to 'c' under covers
using (Activity.Start("c"))
{
}
// transfer to 'b' under covers
}
// transfer to 'a' under covers
}
더 큰주기를 처리하지 않습니다. "UNION SELECT 'Transfer', 'c', 'a'"를 예제에 추가하십시오. –
다행스럽게도이 경우는 내 애플리케이션에서 발생하지 않습니다. 액티비티 트래 버설은 스택처럼 작동합니다. – jsw
아. 이것은 사이클이있는 일반 지향 그래프를 처리하는 훨씬 간단한 경우입니다. –