2016-10-04 1 views
2

나는 자체와 일대 다 관계가있는 테이블을 가지고있다. 이제 분기를 복제하여 다른 루트 아래로 옮기고 싶습니다. 지금까지 내가 시도 enter image description hereoracle의 트리 구조와 같은 테이블에서 특수 루트를 복제하는 방법은 무엇입니까?

: 나는 enter image description here

가 될 의미

INSERT INTO MY_TABLE (ID, 
        CODE, 
        NAME, 
        PARENT) 
    SELECT MY_TABLE_SEC.NEXTVAL, 
      E.CODE, 
      E.NAME, 
      NVL (NULLIF (E.PARENT, TO_NUMBER (:OLDPARENT)), 
       TO_NUMBER (:NEWPARENT)) 
    FROM MY_TABLE E 
    WHERE E.ID != :OLDPARENT 
CONNECT BY NOCYCLE PRIOR E.ID = E.PARENT 
START WITH E.ID = :OLDPARENT 

을하지만, 그것은 단지 복사합니다 첫 번째 수준을 실현하고 있으므로 다른 수준의 두 배를합니다. 어떻게해야합니까?

+0

샘플 데이터 및 원하는 결과 – Aleksej

+0

@Aleksej 추가 된 몇 가지를 게시하시기 바랍니다 한 번 더 수준을 추가! – Khodabakhsh

답변

1
INSERT INTO MY_TABLE (ID, 
        CODE, 
        NAME, 
        PARENT) 
SELECT NEW_ID, CODE, NAME, NVL(PRIOR NEW_ID, :NEWPARENT) 
FROM (
    SELECT A.*, MY_TABLE_SEC.NEXTVAL NEW_ID 
    FROM MY_TABLE A 
    START WITH PARENT=:OLDPARENT 
    CONNECT BY NOCYCLE PRIOR ID = PARENT 
) A 
START WITH PARENT=:OLDPARENT 
CONNECT BY NOCYCLE PRIOR ID = PARENT 

편집 : 나는 "순서가 여기 수 없습니다"오류를 방지

INSERT INTO MY_TABLE (ID, 
        CODE, 
        NAME, 
        PARENT) 
SELECT NEW_ID, CODE, NAME, NVL(PRIOR NEW_ID, :NEWPARENT) 
FROM (
    SELECT A.*, MY_TABLE_SEC.NEXTVAL NEW_ID 
    FROM 
    (
     SELECT A.* 
     FROM MY_TABLE A 
     START WITH PARENT=:OLDPARENT 
     CONNECT BY NOCYCLE PRIOR ID = PARENT 
    ) 
) A 
START WITH PARENT=:OLDPARENT 
CONNECT BY NOCYCLE PRIOR ID = PARENT 
+0

나는 대답의 요점을 이해할 수 없다. – Khodabakhsh

+0

내부 쿼리가 새로운 ID로 분기에서 노드를 반환하면 바깥 쿼리가 새로운 부모 ID를 반환합니다. –

+0

알았는데 : ORA-02287 : 여기서는 시퀀스 번호가 허용되지 않습니다. – Khodabakhsh

관련 문제