2013-12-22 3 views
0

다음 구조를 따르는 테이블이 있습니다.단일 테이블에 대한 재귀 쿼리

Tablename: Codes 
ID int 
CodeID int 
ParentID int 
Name varchar 

CTE에서 모든 값을 반복적으로 선택하기 위해 쿼리를 수행 할 수 있습니까?

CodeID = NULL보다 큰 경우 코드의 루트입니다. 한 단계 아래로 내려 가면 ParentID는 CodeID와 관련됩니다. 코드 FROM 예 : SELECT 이름

경우 고급에서 ID = 널 (null)와 ParentID = X

감사합니다.

답변

1

모든 값을 재귀 적으로 선택한다는 것은 무엇을 의미합니까? 다음 값은 모두 선택합니다.

계층의 모든 코드에 대해 모든 상위 항목을 원한다고 가정 해 봅시다. 당신은 재귀 CTE와 그 작업을 수행 할 수 있습니다

with cte as (
     select c.id, c.codeid, c.parentid, c.name, 
      cast(c.id as varchar(255)) as ids 
     from Codes c 
     union all 
     select cte.id, cte.codeid, c.parentid, cte.name, 
      cast(cte.ids +','+cast(c.parentid as varchar(255)) as varchar(255)) 
     from cte join 
      Codes c 
      on cte.parentid = c.id and c.parentid is not null and 
       ','+cast(cte.parentid as varchar(255))+',' not like '%,'+ids+'%,' 
    ) 
select * 
from cte; 

당신은 특정 부모 ID에 대한이 필터이 그 아래에있는 모든 노드를 얻을 수 있습니다.

Here은 작동 버전을 보여주는 SQL Fiddle입니다.