(참조 : 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
SqlServer를 사용하는 경우 공통 테이블 표현식을 찾습니다. – dasblinkenlight
아마도 다른 질문이나 의견이 나에게 이해가되지 않기 때문에 나는이 질문을 완전히 오해하고있을 것입니다. 전체 계보를 가진 각 최하위 오브젝트에 대해 * 한 행 *을 원하십니까? SQL에서 기대하는 결과는 무엇입니까? –
예, 각 행에 대해 한 행씩 답변을 드리겠습니다. 시퀀스의 어디에서나 발생할 수있는 ID 번호를 확인하고 현재 무엇인지 확인해야합니다.이 값을 지정하지는 않았지만 prevID는 때때로 여러 CurrID로 분기 할 수 있습니다. 다른 사람들을 돕기 위해, 이것은 땅과 관련이 있습니다. 그래서 한 번은 하나의 소포 였고, 나중에 두 소포가 될 수있었습니다. 아니면 2 명이 올 수 있습니다. 따라서 가능한 각 가지가 필요합니다. – user1502755