2013-04-29 2 views
0

간단한 SQL Server 2008 재귀 쿼리를 사용하려고합니다.SQL 재귀 쿼리는 마지막 행만 반환합니다.

에 따라 이러한 예 : I가 기대 된 다음 쿼리

with recury as (
Select 
fs1.ID ,fs1.FParent,fs1.FName 
from FoldersStructure as fs1 
where fs1.FParent =null 
union all 
select fs2.id,fs2.FParent,fs2.FName 
from FoldersStructure as fs2 
inner join recury as r on fs2.FParent= r.ID 
) 
select ID,FParent,FName 
from recury 
where ID=8 

ID fParent fName 
2 NULL  root 
3 2  Drug_Error 
4 2  Incident 
5 4  2007 
6 4  2009 
7 5  2007-1 
8 7  2008-2 

: http://msdn.microsoft.com/en-us/library/ms186243.aspxSQL Server recursive query

나는 테이블을 가지고 ID와 parentID와 얻으세요 :

2 null root 
4 2  incident 
5 4  2007 
7 5  2007-1 
8 7  2007-2 

그러나 나는 마지막 것을 얻습니다. 사전에 감사합니다. 는 식 (8)은 아래의 첫 번째 의견을 바탕으로 행에 대한 결과 집합을 제한하기 때문에

+2

Where 절을 생략 해 보셨습니까? 특히 마지막 행만 가져올 것이라고 말합니다. –

+0

@DaveJohnson, ID = 8을 제거하면 테이블의 모든 행을 가져옵니다. – Lambda

+0

CTE에서 선택된 열 이름이 예제 테이블의 열 이름과 일치하지 않습니다! –

답변

2

은 지금 귀하의 요구 사항을 이해 문에서 WHERE 절을 제거! 8을 시작점으로 사용하고 모든 상위 행을 검색하려면 다음을 수행하십시오.

WITH recury (Id, ParentId, Name, Level) AS 
(
    SELECT fs1.Id ,fs1.ParentId,fs1.Name, CONVERT(int, 0) 
    FROM FoldersStructure AS fs1 
    WHERE fs1.Id = 8 
    UNION ALL 
    SELECT fs2.Id,fs2.ParentId,fs2.Name, Level - 1 
    FROM FoldersStructure AS fs2 
    JOIN recury AS r ON fs2.Id = r.ParentId 
) 
SELECT Id, ParentId, Name, Level 
FROM recury 
ORDER BY Level; 

상위 행의 ID가 숫자 순서가 아닌 경우이 코드가 작동합니다. 상위 행이 항상 숫자 순으로 보장되는 경우 CTE에 도입 된 Level 열을 생략하고 대신 bummi의 답변에 따라 Id 열을 정렬 할 수 있습니다.

SQL 피 일드 예 : http://sqlfiddle.com/#!3/2af0c/4

+0

저장했지만 Id = 8을 제거하면 어떻게 시작 지점을 찾을 수 있습니까? – Lambda

+0

@ 람다 : 귀하의 의견에 따라 답변을 업데이트했습니다. –

+0

그토록 효과적입니다. 많은 감사합니다. 번호 순서입니다.하지만 안전을 위해 레벨을 사용하겠습니다. – Lambda

4
with recury as (
Select 
fs1.ID ,fs1.FParent,fs1.FName 
from FoldersStructure as fs1 
where fs1.ID=8 

union all 
select fs2.id,fs2.FParent,fs2.FName 
from FoldersStructure as fs2 
inner join recury as r on fs2.ID= r.FParent 

) 
select ID,FParent,FName 
from recury 
order by ID 

SQL-Fiddle

+0

고마워요, 당신의 권리를 fs2.ID = r.FParent – Lambda

관련 문제