我在Postgres中有一个小部件食谱表(SQL Fiddle)。配方可以跨越多行,每行代表配方的一个组成部分。每个配方可以有多个部分,这些部分可以有特定数量的子部分。最后,链末尾有子部分,下面没有其他子部分。
如何递归地乘以给定配方的子部件数量?例如,查询WHERE part = 'chest'
应该返回:
| subpart | quantity |
| wood_fragment | 140 |
| metal_fragment | 12 |
答案 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;