2012-07-05 3 views
0

나는 현재 ID (키)의 열과 이전 ID가있는 두 번째 열로 구성된 db 테이블을 가지고 있습니다. ID는 특정 객체에 대한 것이지만 주기적으로 변경해야합니다. ID를 변경하고 개체의 전체 ID 계보를 출력하는 길을 따라 가고 싶습니다. 나는 C#에서 테이블을 텍스트로 변환하고 목록을 사용한 후에이 작업을 수행했다. 그러나 거기에 C#에서 사용할 수있는 SQL 쿼리를 대신 전체 계보에 대한 테이블을 recurse 수 있습니까?C# 및 SQL 재귀 검색 테이블

테이블 : RelatedIDs

CurrID, PrevID (표)

2,1-

4,3

101,2

는 계통 생산할 것이다 :

1 -> 2 -> 101

3 -> 4

고맙습니다. 당신은 공통 테이블 표현식과 MS SQL 2005 이상에이를 수

+0

SqlServer를 사용하는 경우 공통 테이블 표현식을 찾습니다. – dasblinkenlight

+0

아마도 다른 질문이나 의견이 나에게 이해가되지 않기 때문에 나는이 질문을 완전히 오해하고있을 것입니다. 전체 계보를 가진 각 최하위 오브젝트에 대해 * 한 행 *을 원하십니까? SQL에서 기대하는 결과는 무엇입니까? –

+0

예, 각 행에 대해 한 행씩 답변을 드리겠습니다. 시퀀스의 어디에서나 발생할 수있는 ID 번호를 확인하고 현재 무엇인지 확인해야합니다.이 값을 지정하지는 않았지만 prevID는 때때로 여러 CurrID로 분기 할 수 있습니다. 다른 사람들을 돕기 위해, 이것은 땅과 관련이 있습니다. 그래서 한 번은 하나의 소포 였고, 나중에 두 소포가 될 수있었습니다. 아니면 2 명이 올 수 있습니다. 따라서 가능한 각 가지가 필요합니다. – user1502755

답변

0

(참조 : http://msdn.microsoft.com/en-us/library/ms186243(v=sql.105).aspx을) :

; -- You'll only need this if it's not the first statement in the batch 
WITH Recursive AS (
    SELECT CurrID AS ID, CAST(CurrID AS nvarchar) AS Path 
    FROM SourceTable 
    WHERE PrevID IS NULL -- You need to anchor your first result 

    UNION ALL 

    SELECT S.CurrID, P.Path + ' > ' + CAST(CurrID AS nvarchar) 
    FROM SourceTable S 
    INNER JOIN Recursive R ON R.CurrID = S.PrevID 
) 
SELECT * FROM Recursive 

당신은 당신이 필요로하는 것을 얻을 최종 쿼리를 필터링 할 수 있습니다. 위의 맨 아래에서 전체 고유 한 경로 만 필터링하려면 약간의 창의성이 필요하지만 다음과 같이 수행 할 수 있습니다 (테스트하지 못했기 때문에 약간의 미세 조정이 필요합니다) :

; -- You'll only need this if it's not the first statement in the batch 
WITH Recursive AS (
    SELECT CurrID AS ID, CAST(CurrID AS nvarchar) AS Path, 0 AS Depth 
    FROM SourceTable 
    WHERE PrevID IS NULL -- You need to anchor your first result 

    UNION ALL 

    SELECT S.CurrID, P.Path + ' > ' + CAST(CurrID AS nvarchar), P.Depth + 1 
    FROM SourceTable S 
    INNER JOIN Recursive R ON R.CurrID = S.PrevID 
) 
SELECT Path 
FROM Recursive A 
LEFT JOIN Recursive B ON B.Path LIKE A.Path + '%' AND A.Depth < B.Depth 
WHERE B.Path IS NULL 

당신은 대용량 데이터 세트에이 같은 문자열 처리가 빨리 될 수 없습니다 알고 있어야합니다, 그래서 사물이 방법을 수행하는 결정할 때 당신은 조심해야합니다.

SQL 2008에는 유용 ​​할 수도있는 hierarchyid이라는 데이터 형식이 있습니다. 나는 정말 도움이 안되지만 그렇게 사용하지는 않았지만 흥미가 있다면 시작해야합니다 : http://msdn.microsoft.com/en-us/library/bb677290.aspx

+0

이것은 여전히 ​​부모/자식 쌍 당 하나의 결과 집합 행을 생성 할 것입니다. –

+0

WHERE 절을위한 것입니다.) –

+0

사과. 나는 일주일 동안 집을 비웠다. 고마워요 베너. 나는 이것을 시험해보고 결과를 게시 할 것이다. DB를 다루기 때문에 DB 응답을 시도하고 싶습니다. – user1502755