Postgres递归查询以在遍历parent_id时更新字段的值

时间:2013-10-15 16:30:18

标签: sql postgresql postgresql-9.1

这是表格

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

这是一个从节点1执行CTE并遍历user_id 1的所有子节点直到到达叶子并将travesed chidren 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

的值

1 个答案:

答案 0 :(得分:5)

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

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

请注意,联接条件是相反的。

通常,递归查询的工作方式如下:

  1. 起始记录集由WITH RECURSIVE子句中的UNION ALL中的第一个选择确定。
  2. UNION ALL中的第二个选择定义了从目前为止找到的记录派生下一级记录的方式。当从上到下遍历时,此查询应查找所有子项。从底部到顶部遍历时,应该找到父级。
  3. 执行步骤2,直到在某次迭代中没有添加新记录。