PostgreSQL,用于按配方计算成分的复杂查询

时间:2013-06-12 07:25:41

标签: postgresql

我必须计算存储在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程序提供准备好的结果吗?
也许对我来说似乎并不太复杂?该查询将如何?

1 个答案:

答案 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 演示