2012-09-17 5 views
0

나는 단지 하나 개의 컬럼과 테이블 RD이 있습니다SQL Server에서 여러 값으로 계층 구조를 가져 오는 방법은 무엇입니까?

----- 
rd_id 
----- 
3 
2 
6 
7 
8 

나는 두 개의 열이 테이블 DL이이 테이블에 저장에 계층 구조가 :

---------------------- 
dl_id  dl_parent 
---------------------- 
1   2    
2   Null 
3   Null 
4   6 
6   7 
7   8 
8   Null 

이제 문제는 어떻게 얻을 수있는 RD 테이블의 멤버를 사용하여 DL 테이블에서 계층 구조를 제거합니다. 결과가 될 것입니다 : 나는 그것의 균열을 얻을 수 없다 여전히 금요일에서이 문제를 수고하고 있었어요

-------------- 
rd_id dl_id 
-------------- 
3   3 

2   2 

6   6 
6   7 
6   8 

7   7 
8   8 

8   8 

. 공통 테이블 식을 사용하여 하나의 값에서 재귀를 탐색 할 수 있다는 것을 알고 있습니다 (예 : 입력 6에서 하나의 함수를 만들고 6,7,8을 생성). 하지만 여러 값 (rd_id)을 사용하는 방법을 모르겠습니다.

몇 가지 아이디어가 있으십니까?

+1

를' dl_id'는 결과 테이블의 동일한'dl_id'와 동일합니까? 부모 ID가 없어야합니까? 「3 3」, 「2 2」, 「8 8」 –

+0

안녕하세요, 도메인 전문가로부터 비즈니스 규칙입니다. 이는 차원 수준 및 특성과 상관 관계가있는 비즈니스 인텔리전스 사례이기 때문에 그러나 귀하의 의견을 보내 주셔서 감사합니다 :) – Awan

답변

1

올바른 결과가 생성됩니다. 데이터 설정 :

declare @RD table (rd_id int not null) 
insert into @RD(rd_id) values 
(3), 
(2), 
(6), 
(7), 
(8) 

declare @DL table (dl_id int not null,dl_parent int null) 
insert into @DL(dl_id,dl_parent) values 
(1,2),   
(2,Null), 
(3,Null), 
(4,6), 
(6,7), 
(7,8), 
(8,Null) 

그리고 쿼리 :

;with AllValues as (
    select rd_id,rd_id as dl_id from @RD 
    union all 
    select rd_id,dl_parent 
    from AllValues av 
     inner join 
     @DL dl 
      on 
       av.dl_id = dl.dl_id 
    where 
     dl.dl_parent is not null 
) 
select * from AllValues 

결과 :

rd_id  dl_id 
----------- ----------- 
3   3 
2   2 
6   6 
7   7 
8   8 
7   8 
6   7 
6   8 

설명 :

열팽창 계수의 앵커에

, 우리는 단순히 @RD에서 rd_id를 선택 표 두 번 - 샘플은 모든 입력 행이 두 열에 같은 값을 갖는 출력 행.

그런 다음 두 번째 열을 기반으로 찾을 수있는 일치하는 상위 행에 대해 @DL 테이블에 가입합니다. 부모를 찾으면 부모 값을 두 번째 열로 대체하여 새로운 행을 생성합니다. 이것은 새로운 행이 생성되지 않을 때까지 계속됩니다.

+0

답변과 설명 감사합니다 Damien :) 그것은 문제를 보는 새로운 관점을 제공합니다. 다시 한번 감사드립니다! – Awan

0

당신은보기를이 즉석에서이 같은 재귀 쿼리 만드는 데 사용해야합니다 : 당신이 수`dl_parent` =`NULL`으로`dl_id` 년대를 원하는 이유는 무엇

with n as (
select dl_id, dl_id as ancestor 
from dbo.dl 
union all 
select np1.dl_id, n.ancestor 
from dl as np1 , n 
where n.dl_id = np1.dl_parent) 
select * from n 
where dl_id in (select rd_id from rd) 
order by dl_id, ancestor 
+0

실시간보기, 멋지다 ... 그것은 나를 위해 새로운 것. 대단히 Ecarry :) 고맙습니다. – Awan

+0

만약 당신이 그것을 좋아한다면 투표하십시오 :) –

관련 문제