2016-10-04 38 views
2

我有一個與自己有一對多關係的表。現在我想克隆一個分支並將其移動到其他根目錄下。我的意思是 enter image description here如何在oracle中克隆具有樹狀結構的表中的特殊根?

成爲: 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