2014-03-26 2 views
2
내가 부모 - 자식 관계

T-SQL 재귀 쿼리

ID | ParentID | description 
1 | null | Company 
2 | 1 | Department 
3 | 2 | Unit1 
4 | 2 | Unit2 
5 | 4 | Unit3 
6 | 4 | Unit4 

와 테이블을 가지고 다음과 같은 결과 표시한다고 가정한다 재귀 쿼리 작업입니다

:

ID | ParentID | description 
1 | null | Company 
2 | 2 | Department 
3 | 2 | Unit1 
4 | 2 | Unit2 
5 | 2 | Unit3 
6 | 2 | Unit4 

물론 하위 및 부대의 수는 더 많습니다. 기본 퀘스트는 상위 및 하위 수준에 대해 parentId를 표시하는 것입니다. 이 아이디어를 얻기위한 아이디어가 있습니까?

지금까지 난 단지

WITH cte (ID, ParentID, description) 
AS 
(
    SELECT ID, ParentID, description 
    FROM T1 
    UNION ALL 
    SELECT e.ID, e.ParentID, e.description 
    FROM T2 AS e 
    JOIN cte ON e.ID = cte.ParentID 

) 
SELECT 
cte.ID, cte.ParentID, cte.description 
FROM cte 
cte.ParentID is not null 
+0

SQL Fiddle에서 이것을 시험해보십시오. –

답변

1

귀하의 구문은 매우 옳지 않아이 쿼리를했으나 생각은 옳은 방향이다. 결국 부모의 부모가 NULL 인 행을 가져 오려고합니다. 이것은 작동하지 않을 수 있습니다 (테스트되지 않았습니다).

WITH cte(ID, ParentID, description, lev) AS 
     (SELECT ID, ParentID, description, 1 as lev 
     FROM table T1 
     UNION ALL 
     SELECT cte.ID, e.ParentID, cte.description, cte.lev + 1 
     FROM table e JOIN 
      cte 
      ON e.ID = cte.ParentID 
    ) 
SELECT cte.ID, cte.ParentID, cte.description 
FROM cte left outer join 
    table t 
    on cte.ParentId = t.ParentId  
WHERE t.ParentID is null; 
+0

아쉽게도 쿼리 반환 msg : 문이 종료되었습니다. 명령문 완료 전에 최대 재귀가 모두 소모되었습니다. 최대 재귀를 32767로 증가했지만 성공하지 못했습니다. – arth81

+0

추가 : 옵션 (maxrecursion x) 여기서 x는 예외를 throw하기 전에 허용 할 재귀의 수입니다 (기본값은 100입니다). –

+0

@ arth81. . . 그러면 사용중인 데이터에 사이클이 있음을 알 수 있습니다. –