我必须计算存储在PostgreSQL表中的食物和食物成分:
table1 'usedfood'
food food used used
code name qty meas
----------------------------------------------
10 spaghetti 3 pcs
156 mayonnaise 2 pcs
173 ketchup 1 pcs
172 bolognese sauce 2 pcs
173 ketchup 1 pcs
10 spaghetti 2 pcs
156 mayonnaise 1 pcs
table2 'ingredients'
food ingr. ingredient qty meas
code code name /1 in 1
----------------------------------------------
10 1256 spaghetti rinf 75 gramm
156 1144 salt 0.3 gramm
10 1144 salt 0.5 gramm
156 1140 fresh egg 50 gramm
172 1138 tomato 80 gramm
156 1139 mustard 5 gramm
172 1136 clove 1 gramm
156 1258 oil 120 gramm
172 1135 laurel 0.4 gramm
10 1258 oil 0.4 gramm
172 1130 corned beef 40 gramm
结果:
used
times code food/ingredient qty meas
----------------------------------------------
5 1256 spaghetti rinf 375 gramm
8 1258 oil 362 gramm
2 1138 tomato 160 gramm
3 1140 fresh egg 150 gramm
2 1130 corned beef 80 gramm
3 1139 mustard 15 gramm
8 1144 salt 3.4 gramm
2 1136 clove 2 gramm
2 1135 laurel 0.8 gramm
2 173 ketchup 2 pcs //haven't any ingredients
现在我通过循环遍历table1并为每一行查询table2然后添加结果等(使用C)在较大的数据上可能非常慢,这样做。
表1包含食品代码,食品名称和使用数量。
表2包含成分(杂乱的顺序),包含食品和平食品的代码和使用数量,以及出现的食品代码。
来自table1的已使用数量应根据每个配方与table2中的数量相乘,并应添加到成分代码的结果中
所以进入食物“意大利面条”的所有成分行都以食物意大利面条代码(10)开头
不含任何成分的食物应按表1中的数量计算,并显示相同的名称。这实际上意味着它是最终产品(如啤酒瓶)
这可能更复杂,但我很害怕问。
例如,在ingredinets列表中,列表可能是自己配方的成分。例如含有醋,盐,种子等的芥末......那么呢?
在所示示例的表2中,芥末用作现成产品(组分)。
这里有什么方法可以使用PostgreSQL进行这样的计算并快速获得结果,这将为C程序提供准备好的结果吗?
也许对我来说似乎并不太复杂?该查询将如何?
答案 0 :(得分:1)
尝试
SELECT SUM(f.qty) used_times,
COALESCE(i.ingr_code, f.food_code) code,
COALESCE(i.name, f.name) name,
SUM(COALESCE(i.qty, 1) * f.qty) qty,
COALESCE(i.meas, f.meas) meas
FROM usedfood f LEFT JOIN ingredients i
ON f.food_code = i.food_code
GROUP BY i.ingr_code, i.name
输出:
| USED_TIMES | CODE | NAME | QTY | MEAS | ---------------------------------------------------- | 2 | 173 | ketchup | 2 | pcs | | 2 | 1130 | corned beef | 80 | gramm | | 2 | 1135 | laurel | 0.8 | gramm | | 2 | 1136 | clove | 2 | gramm | | 2 | 1138 | tomato | 160 | gramm | | 3 | 1139 | mustard | 15 | gramm | | 3 | 1140 | fresh egg | 150 | gramm | | 8 | 1144 | salt | 3.4 | gramm | | 5 | 1256 | spaghetti rinf | 375 | gramm | | 8 | 1258 | oil | 362 | gramm |
这是 SQLFiddle 演示