Postgres递归查询以在遍历parent_id时更新字段的值
Posted
技术标签:
【中文标题】Postgres递归查询以在遍历parent_id时更新字段的值【英文标题】:Postgres recursive query to update values of a field while traversing 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 【参考方案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 中的条件是相反的。
一般递归查询的工作方式如下:
-
起始记录集由 WITH RECURSIVE 子句中 UNION ALL 中的第一个选择确定。
UNION ALL 中的第二个选择定义了如何从目前找到的记录中派生出下一级记录。当从上到下遍历时,这个查询应该找到所有的孩子。从下到上遍历时,应该找到父级。
执行第 2 步,直到在某个迭代中没有添加新记录。
【讨论】:
以上是关于Postgres递归查询以在遍历parent_id时更新字段的值的主要内容,如果未能解决你的问题,请参考以下文章
用递归或函数替换 SELECT 中的迭代 INSERT 以遍历 Postgres 中的路径
使用 row_to_json 的 Postgres 递归查询
使用 Postgres 范围的递归 SQL 查询以查找可用性
php递归查询不会,,求教。就是一个三级分类传个ID找到他的上级,还有父级。。