Postgres recursive query to update values of a field while traversing parent_id

use*_*359 3 sql postgresql postgresql-9.1

This is the table

  user_id | parent_id | lft
  --------|-----------|-----
        1 |           | 0
        2 |         1 | 0
        3 |         1 | 0
        4 |         2 | 0
Run Code Online (Sandbox Code Playgroud)

Here is a query to do a CTE from node 1 and traverse all the children of user_id 1 until a leaf is reached and update the value of the travesed chidren lft field to 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
Run Code Online (Sandbox Code Playgroud)

I am just asking for a query that will go in the opposite direction .. ie. from any node to the root node so I can update the value of lft

Rom*_*val 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
Run Code Online (Sandbox Code Playgroud)

请注意,连接中的条件是相反的.

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

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