【问题标题】:Postgresql copy data within the tree tablePostgresql 复制树表内的数据
【发布时间】:2012-04-05 08:29:43
【问题描述】:

我有一个树形结构的表,列是idcategoryparent_id

现在我需要将一个节点及其子节点复制到另一个节点,复制时,类别必须相同,但具有新的 id 和 parent_id..

我的输入将是node to copy & destination node to copy

我已经解释了图像文件中的树结构..

我需要一个函数来做到这一点..,

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)

【问题讨论】:

  • 帮助我获得 2 个输入并完成工作...
  • 所以基本上你想克隆一个子树?难的。我正在考虑。
  • 是的,它很难..我已经尝试了很多功能..没用..
  • 我认为可以做到,但您至少需要表格中的一位“状态”。你有备用柱子吗? (也可以在单独的表格中完成)
  • 谁能帮我this

标签: sql function postgresql tree


【解决方案1】:

(在 PostgreSQL 8.4.3 下测试)

以下查询将新 ID 分配给节点 4 下的子树(参见 nextval),然后找到 父母的相应新 ID(参见 LEFT JOIN)。 p>

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

结果(根据您的测试数据):

new_id  category    new_parent_id
------  --------    -------------
9       C4          
10      C5          9
11      C6          9
12      C7          10

一旦你有了它,就很容易将它插入到表中,你只需要小心地将子树根重新连接到适当的父级(在这种情况下为 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

【讨论】:

  • 这太棒了。我没想到递归+下一个组合可以在不需要额外的状态变量的情况下做到这一点。起首!
  • 谁能帮我this
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-04-26
  • 2012-05-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多