2016-10-04 9 views
2

私はそれ自身と1対多の関係を持つテーブルを持っています。今私はブランチを複製し、それを他のルートの下に移動したい。 enter image description hereoracleの木のような構造を持つ表の特別なルートをクローンする方法は?

は、これまでのところ、私が試してみました:

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 

しかし、あなたが実現し得るような、それはコピーのみ最初のレベルや他のレベルの二重を作ると私は enter image description here

になるわけ。 どうすればよいですか?

+0

の1つの以上のレベルを追加し、いくつかのサンプルデータおよび所望の結果 – 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

GOT:ORA-02287:ここではシーケンス番号は使用できません – Khodabakhsh

関連する問題