2014-08-30 3 views
1
나는 이진 트리가 SQL 서버에서 테이블 2014 데이터베이스 제시

:SQL 쿼리는 마지막 바이너리 왼쪽 또는 오른쪽으로 위치를 얻을 수

enter image description here

I :

여기
UserID ParentUserID Position 
------------------------------ 
1  null   null  <-- ROOT 
2  1   Left 
3  1   Right <-- Last right for ID=1 (query should return 3) 
4  2   Left 
5  4   Left 
6  2   Left 
7  6   Left  <-- Last left for ID=1 (query should return 6) 

그래픽 표현입니다 2 개의 쿼리를 작성해야합니다. 위 다이어그램의 빨간색 선은 검색해야하는 노드를 보여줍니다.

  1. 마지막 왼쪽 다리 ID.
  2. 마지막으로 오른쪽 다리 아이디
어떻게 내 목표를 달성 할 수

... 내가 재귀 쿼리를 사용해야합니까?

내가 필요한 검색어의 예를 제공해 주시겠습니까?

답변

2

당신은 (CTE를.) 재귀 공통 테이블 식을 왼쪽이나 오른쪽을 재귀 수 있습니다 당신이 가장 깊은 노드를 찾을 수 select top 1 * ... order by depth 사용 :

; with left_hand_recurse as 
     (
     select UserID 
     ,  ParentUserID 
     ,  1 as depth 
     from Table1 where ParentUserID is null 
     union all 
     select child.UserID 
     ,  child.ParentUserID 
     ,  parent.depth + 1 
     from left_hand_recurse parent 
     join Table1 child 
     on  parent.UserID = child.ParentUserID 
       and position = 'Left' 
     ) 
select top 1 * 
from left_hand_recurse 
order by 
     depth desc 
; 

Example at SQL Fiddle.

P.S.을 귀하의 예제 데이터는 6과 4를 모두 2의 왼쪽 부모로 만듭니다. 나는 6이 5의 왼쪽 부모라고 가정합니다.

+0

좋아요! 정확히 내가 무엇을 찾고 있었는지. CTE에 대해 생각하고 '함께'사용하려고했지만 훨씬 빠릅니다. 고마워요! –

관련 문제