【问题标题】:Postgres recursive query to update values of a field while traversing parent_idPostgres递归查询以在遍历parent_id时更新字段的值
【发布时间】:2013-10-15 16:30:17
【问题描述】:

这是桌子

  user_id | parent_id | lft
  --------|-----------|-----
        1 |           | 0
        2 |         1 | 0
        3 |         1 | 0
        4 |         2 | 0

这是一个从节点 1 执行 CTE 并遍历 user_id 1 的所有子节点直到到达叶子并将遍历的子节点 lft 字段的值更新为 1 的查询

WITH RECURSIVE d AS (
  SELECT user_id
   FROM btrees
   WHERE user_id = 1
 UNION ALL
  SELECT c.user_id
   FROM d JOIN btrees c ON c.parent_id = d.user_id
)
UPDATE btrees b set lft = 1
 FROM d
 WHERE d.user_id = b.user_id

我只是要求一个相反方向的查询..即。从任何节点到根节点,所以我可以更新 lft 的值

【问题讨论】:

  • 你有输入输出的例子吗?
  • 你到底想更新什么?
  • 我想更新 lft 的值(见编辑)
  • lft 的新值应该是什么?孩子的价值总和?
  • lft 的值将来自其他地方,所以我们称之为 x

标签: sql postgresql postgresql-9.1


【解决方案1】:

从某个节点到根节点更新所有节点的查询非常相似:

WITH RECURSIVE d AS (
  SELECT user_id
   FROM btrees
   WHERE user_id = :node_id
 UNION ALL
  SELECT c.user_id
   FROM d JOIN btrees c ON d.parent_id = c.user_id
)
UPDATE btrees b set lft = 1
 FROM d
 WHERE d.user_id = b.user_id

注意,join 中的条件是相反的。

一般递归查询的工作方式如下:

  1. 起始记录集由 WITH RECURSIVE 子句中 UNION ALL 中的第一个选择确定。
  2. UNION ALL 中的第二个选择定义了如何从目前找到的记录中派生出下一级记录。当从上到下遍历时,这个查询应该找到所有的孩子。从下到上遍历时,应该找到父级。
  3. 执行第 2 步,直到在某个迭代中没有添加新记录。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-04
    • 2023-03-29
    • 1970-01-01
    • 2015-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多