【问题标题】:Get all ancestors of a child in postgres recursive query在postgres递归查询中获取孩子的所有祖先
【发布时间】:2021-07-09 13:49:07
【问题描述】:

我正在尝试通过加入另一个表来获取孩子的所有相关祖先的更多信息。 我对后端有点陌生,所以递归 cte 很难理解。

查找 SQL Fiddle here

我拥有的数据:product_id,user_id

我需要的数据:

user_id master_id cost
id(john_snow) null 4
id(bran_stark) id(john_snow) 6
id(arya_stark) id(bran_stark) 8
id(sansa_stark) id(arya_stark) 10

这样我就可以为各个用户增加利润,并以最低的成本作为公司利润。

【问题讨论】:

  • 请提供此数据样本的创建表和插入语句(最好在小提琴中)。永远不要将数据作为图片发布。
  • @JimJones 用小提琴更新问题
  • 您可能会发现闭包表更易于使用和查询 - stackoverflow.com/a/38701519/5962802

标签: sql postgresql common-table-expression recursive-query


【解决方案1】:

RECURSIVE CTE 就是您要找的。乍一看,它可能看起来很混乱,但经过一些练习,它就会变得不言自明。最后,它只是一个UNION,查询略有不同:

WITH RECURSIVE get_ancestor(child,parent,cost) AS (
  SELECT r.user_id,r.parent_id,c.cost FROM user_relation r
  JOIN product_cost c ON c.user_id = r.user_id
  UNION 
  SELECT g.child,g.parent,c.cost FROM get_ancestor g
  JOIN user_relation r ON r.user_id = g.child
  JOIN product_cost c ON c.user_id = r.user_id 
)
SELECT * FROM get_ancestor;

演示:SQL Fiddle

【讨论】:

  • 非常感谢。
  • @RafidKotta 不客气.. 为小提琴 +1。欢呼
猜你喜欢
  • 2011-07-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多