Postgres中的递归乘法

时间:2018-01-23 01:05:03

标签: postgresql recursion

我在Postgres中有一个小部件食谱表(SQL Fiddle)。配方可以跨越多行,每行代表配方的一个组成部分。每个配方可以有多个部分,这些部分可以有特定数量的子部分。最后,链末尾有子部分,下面没有其他子部分。

如何递归地乘以给定配方的子部件数量?例如,查询WHERE part = 'chest'应该返回:

| subpart        | quantity |
| wood_fragment  | 140      |
| metal_fragment | 12       |

2 个答案:

答案 0 :(得分:0)

这个问题非常类似于递归CTE的Postgres documentation中给出的示例。请尝试使用以下查询:

WITH RECURSIVE cte(subpart, part, quantity) AS (
    SELECT part, subpart, quantity FROM widget_recipes WHERE part = 'chest'
    UNION ALL
    SELECT t2.part, t2.subpart, t2.quantity
    FROM cte t1
    INNER JOIN widget_recipes t2
        ON t1.subpart = t2.part
)

SELECT part, subpart, quantity
FROM cte;

答案 1 :(得分:0)

我改编了IBM's recursion example about bill of materials (BOM)的答案:

WITH RECURSIVE cte(part, subpart, quantity) AS (
    SELECT part, subpart, quantity
    FROM widget_recipes
    WHERE part = 'chest'
  UNION ALL
    SELECT parent.part, child.subpart, parent.quantity * child.quantity
    FROM cte parent, widget_recipes child
    WHERE parent.subpart = child.part
  )

SELECT subpart, sum(quantity) as total_quantity
FROM cte
  WHERE subpart LIKE '%_fragment' -- omit if you need intermediate subparts
GROUP BY subpart
ORDER BY total_quantity DESC, subpart;