2017-10-14 9 views
1

나는 자식 ID와 부모 ID의 SQLite 테이블을 가지고 있습니다. 부모가 자식 열에도 나타날 수 있습니다. 예를 들면 :재귀 CTE를 가진 최종 부모 찾기

child parent 
----- ------ 
3  4 
2  3 
1  2 
5  4 
7  8 
6  7 
나는 아이가 하나의 열 및 궁극적 인 부모 (모든 recusing 완료 후 남아있는 부모)에 나열된 테이블에 재귀 적 구조에서이 변환하고자하는

가 나열됩니다 다른.

child ultimate_parent 
----- --------------- 
3  4 
2  4 
1  4 
5  4 
7  8 
6  8 

나는이 SQLites 재귀 CTE를를 사용 가능해야 이해하지만 문제가 쿼리를 개발하는 데 문제 : 예를 들어, 위의 표가 될 것이다. 아래는 내가 지금까지 가지고있는 것이지만, 분명히 불완전하다.

WITH RECURSIVE rel(child, parent) AS (
     SELECT child, parent FROM relationships 
     UNION ALL 
     SELECT child, parent FROM rel 
    ) 
    SELECT * FROM rel; 

어떤 도움을 주시면 감사하겠습니다.

재귀 단계는 다음 단계의 데이터를 계산하기 위해 이전 단계와 원래의 테이블에서 데이터를 사용해야합니다

PRAGMA foreign_keys=OFF; 
BEGIN TRANSACTION; 
CREATE TABLE `relationships` (
    `child` INTEGER, 
    `parent` INTEGER 
); 
INSERT INTO relationships VALUES(3,4); 
INSERT INTO relationships VALUES(2,3); 
INSERT INTO relationships VALUES(1,2); 
INSERT INTO relationships VALUES(5,4); 
INSERT INTO relationships VALUES(7,8); 
INSERT INTO relationships VALUES(6,7); 
COMMIT; 
+0

'.dump' 같은 데이터베이스 구조와 stuitably 맞는 장난감 데이터베이스의 샘플 컨텐츠 (의 예 선을주십시오'작성 : 당신은, 즉 궁극적 인 부모를 필터링 어린이하지 않은 그 부모가 테이블 ... '과'...에 끼어 들다 '). – Yunnosch

답변

0

위의 예 테이블 덤프 :

WITH RECURSIVE ... 
    ... 
    UNION ALL 
    SELECT rel.child, 
      relationships.parent 
    FROM relationships 
    JOIN rel ON rel.parent = relationships.child 
) 

그리고 CTE는 가능한 모든 직접 및 간접 부모를 생성합니다.

WITH ... 
SELECT * 
FROM rel 
WHERE parent NOT IN (SELECT child 
        FROM relationships); 
+0

정말 고마워요! 나는 어떻게 든 다음 단계를 위해 이전 단계를 사용해야한다는 것을 알았지 만 그 모습이 어떤 것인지 확신 할 수 없었습니다. . . 지금 나는 그렇다. – Chris