2012-04-05 22 views
6

ツリーテーブル内のデータをコピーし、列はコピー中に今私は、別のノードにコピーノードとその子のを必要とするidcategoryparent_idPostgreSQLは、私は、ツリー構造を持つテーブルがある

です、カテゴリは同じでなければなりませんが、新規IDやPARENT_IDで..

私の入力はnode to copy & destination node to copy

になります10

私はそうする機能を必要とする。..画像ファイルに

をツリー構造を説明しました..

PostgreSQLのバージョンでテスト9.1.2

Column | Type |     Modifiers      
-----------+---------+------------------------------------------------- 
id  | integer | not null default nextval('t1_id_seq'::regclass) 
category | text | 
parent_id | integer | 
Indexes: 
    "t1_pkey" PRIMARY KEY, btree (id) 
Foreign-key constraints: 
    "fk_t1_1" FOREIGN KEY (parent_id) REFERENCES t1(id) 
Referenced by: 
    TABLE "t1" CONSTRAINT "fk_t1_1" FOREIGN KEY (parent_id) REFERENCES t1(id) 
+0

2入力を取得してジョブを実行する機能を手伝ってください... – MAHI

+0

基本的にサブツリーをクローンしたいですか?ハード。私はそれについて考えている。 – wildplasser

+0

はいそのハード..私は多くの機能を試してみました..いいえ使用.. – MAHI

答えて

5

を(

次のクエリでは、ノード4(「nextval」を参照)のサブツリーに新しいIDを割り当てて、対応するものを見つけます親の新しいID を掲示するLEFT JOINを参照)。あなたはそれがテーブルに戻ってそれを挿入するのは簡単だ、というたら

は、あなただけのサブツリーのルートを再接続するために注意する必要があります
new_id category new_parent_id 
------ -------- ------------- 
9  C4   
10  C5   9 
11  C6   9 
12  C7   10 

WITH RECURSIVE CTE AS (
    SELECT *, nextval('t1_id_seq') new_id FROM t1 WHERE id = 4 
    UNION ALL 
    SELECT t1.*, nextval('t1_id_seq') new_id FROM CTE JOIN t1 ON CTE.id = t1.parent_id 
) 
SELECT C1.new_id, C1.category, C2.new_id new_parent_id 
FROM CTE C1 LEFT JOIN CTE C2 ON C1.parent_id = C2.id 

結果(テストデータに)適切な親(この場合8、COALESCE(new_parent_id, 8)を参照):

:その後

INSERT INTO t1 
SELECT new_id, category, COALESCE(new_parent_id, 8) FROM (
    WITH RECURSIVE CTE AS (
     SELECT *, nextval('t1_id_seq') new_id FROM t1 WHERE id = 4 
     UNION ALL 
     SELECT t1.*, nextval('t1_id_seq') new_id FROM CTE JOIN t1 ON CTE.id = t1.parent_id 
    ) 
    SELECT C1.new_id, C1.category, C2.new_id new_parent_id 
    FROM CTE C1 LEFT JOIN CTE C2 ON C1.parent_id = C2.id 
) Q1 

、テーブルは、以下のデータが含まれてい

new_id category new_parent_id 
------ -------- ------------- 
1  C1 
2  C2   1 
3  C3   1 
4  C4   2 
5  C5   4 
6  C6   4 
7  C7   5 
8  C8   3 
9  C4   8 
10  C5   9 
11  C6   9 
12  C7   10 
+0

これは素晴らしいです。私は再帰+次のコンボが特別な状態変数を必要とせずにこのトリックを行うことができるとは思わなかった。シャペー! – wildplasser

+0

@ Brankoありがとう、それは9.1.2でも同様に働いた.... – MAHI

+0

誰も助けてくれます[this](http://stackoverflow.com/questions/9077266/postgresql-update-tree-table-withrows -from-same-table-by-change-id-andparenから) – MAHI

関連する問題