2013-12-17 6 views
0

한 스키마에서 다른 스키마로 데이터베이스를 변환하는 가져 오기 도구를 작성하려고합니다.연속적인 방법으로 부모 - 자식 관계 쿼리

그래서 이제 부모 - 자식 관계 (PK ID FK ParentID 경유)를 사용하는 테이블을 보았고 모든 레코드를 연속적으로 선택하려고합니다.

내 쿼리의 위험 요소는 부모 요소가 아직 가져 오지 않은 하위 요소를 가져 오려고 할 수 있다는 것입니다. 이렇게하면 가져 오지 않을 레코드 집합이되므로 피할 수 있습니다.

I가 작업 한

내 쿼리는 다음과 같습니다 :

SELECT * FROM Table a INNER JOIN Table b ON (b.ParentID=a.ID and a.ID= b.ParentID) 

를 불행하게도 (그것은 나에게 테이블의 모든 레코드를 제공하지 않습니다) 작동하지 않는, 그래서 제공하는 질의를 필요로한다 나 테이블에있는 모든 행을 자식 요소와 부모 요소로 정렬하여 가져 오기 위해 반복 할 수 있습니다.

누군가 나를 인도 할 수 있습니까?

+0

두 경우 모두 같기 때문에 쿼리의'및'절은 필요하지 않습니다. 그러나 이와 같은 경우에는 먼저 모든 부모 레코드를 가져온 다음 모든 자식 레코드를 가져올 것입니다. 즉, 'TableB select * from ParentID가 null 인 테이블에서 가져 오기'와 같이 'Import into TableB select * 테이블에서 ParentID가 null이 아닙니다 '. – beercodebeer

+0

나는 그와 비슷한 것을 생각했다. 하지만 상속 깊이가 1 이상이기 때문에 작동하지 않습니다. 따라서 하위 요소가 다른 하위 요소의 부모 요소 일 수 있습니다. – SeToY

+0

그러나 절대 상위 요소가 있어야합니다. 그렇지 않습니다. 자녀가 아닌 요소? 만약 그렇다면 여전히 첫 번째 쿼리를 실행 한 다음 모든 레코드를 얻을 때까지 다음과 같은 것을 반복적으로 실행할 수 있습니다 :'TableB select * from Table로 삽입 ParentID가 null이 아니고 존재하는 경우 (TableB에서 ID = Table.ParentID)' – beercodebeer

답변

1

당신이 찾고있는 것은이 링크에서 찾을 수 있습니다 재귀 공통 테이블 식입니다. http://technet.microsoft.com/en-us/library/ms186243%28v=sql.105%29.aspx

당신은 순서 일을로드해야합니다 귀하의 다운 스트림 ETL에게 이것을 사용할 수 있습니다 예를 들어, 모두 1 위, 2 위 2 등.

DECLARE @Table TABLE (
ID INT, 
ParentId INT) 

INSERT INTO @Table 
VALUES 
    (1, 0), 
    (2, 1), 
    (3, 1), 
    (4, 0), 
    (5, 4), 
    (6, 4), 
    (7, 1), 
    (8, 7) 

--This is the anchor query and selects top level records 
;WITH cte_Recursive AS (
    SELECT ID, ParentId, 1 [Depth] 
    FROM @Table 
    WHERE ParentId = 0 

    UNION ALL 

    SELECT T.ID, T.ParentId 
     ,R.Depth + 1 [Depth] 
    FROM @Table T 
    INNER JOIN cte_Recursive R ON R.ID = T.ParentId 
) 

SELECT * 
FROM cte_Recursive 
+0

이제 이것은 정확히 내가 원했던 ... 그리고 지금 나는 그것이 무엇인지 불렀다는 것을 안다. 감사! :) – SeToY