1

에 주어진 자체 참조 테이블에 ID의 전체 체인을 받기 내가 가지고있는 다음과 같은 데이터가 들어있는 테이블 : 내가 좋아하는 것어떤 ID hierachy

+----+----------+ 
| ID | ParentID | 
+----+----------+ 
| 27 | 0  | 
| 38 | 27 | 
| 45 | 38 | 
| 86 | 0  | 
| 92 | 45 | 
| 48 | 86 | 
| 62 | 92 | 
| 50 | 62 | 
----------------- 

어떤 ID를 통과 할 수 있기를 저장 프로 시저를 사용하고 전체 주어진 ID의 체인 (부모 및 하위) 체인을 가져옵니다.

즉. 내가 ID = 45를 전달하면, 내가 가야 :

27 
38 
45 
92 
62 
50 

을 마찬가지로, 나는 ID = (86)를 통과하면, 내가 가야 :

86 
48 

어떤 도움을 크게 감상 할 수있다!

답변

1

두 개의 재귀 적 CTE를 사용할 수 있습니다. 첫 번째 노드는 루트 노드를 찾고 두 번째 노드는 체인을 만듭니다.

declare @T table(ID int, ParentID int) 

insert into @T values (27, 0), (38, 27), (45, 38), (86, 0), 
         (92, 45), (48, 86), (62, 92), (50, 62)  

declare @ID int = 45 

;with cte1 as 
(
    select T.ID, T.ParentID, 1 as lvl 
    from @T as T 
    where T.ID = @ID 
    union all 
    select T.ID, T.ParentID, C.lvl+1 
    from @T as T 
    inner join cte1 as C 
     on T.ID = C.ParentID 
), 
cte2 as 
(
    select T.ID, T.ParentID 
    from @T as T 
    where T.ID = (select top 1 ID 
       from cte1 
       order by lvl desc) 
    union all 
    select T.ID, T.ParentID 
    from @T as T 
    inner join cte2 as C 
     on T.ParentID = C.ID 
) 
select ID 
from cte2 

버전 2

약간 짧고 쿼리 계획은보다 효과적인 제안하지만 당신은 결코 실제 데이터에 테스트없이 알 수 없습니다.

;with cte as 
(
    select T.ID, T.ParentID, ','+cast(@ID as varchar(max)) as IDs 
    from @T as T 
    where T.ID = @ID 
    union all 
    select T.ID, T.ParentID, C.IDs+','+cast(T.ID as varchar(10)) 
    from @T as T 
    inner join cte as C 
     on (T.ID = C.ParentID or 
      T.ParentID = C.ID) and 
      C.IDs+',' not like '%,'+cast(T.ID as varchar(10))+',%' 
) 
select ID 
from cte 
+0

도움 주셔서 감사합니다. Mikael. 첫 번째 솔루션이 원하는 결과를 반환했습니다. – 8thWonder