PostgreSQL,查询问题中的语法

时间:2013-06-12 12:05:58

标签: postgresql

我已经在我的问题here

上得到了很好的答案

所以如果我创建表:

CREATE TABLE IF NOT EXISTS usedfood 
(food_code int, name text, qty int, meas text);

INSERT INTO usedfood (food_code, name, qty, meas) 
VALUES  (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');

CREATE TABLE IF NOT EXISTS ingredients 
(food_code int, ingr_code int, name text, qty decimal(11,3), meas text);

INSERT INTO ingredients (food_code, ingr_code, name, qty, meas) 
VALUES  (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');

从我的PostgreSQL执行此查询:

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 

...我仍然无法在SQL fiddle

上得到这样的结果

我收到了这样的错误:

  

错误:“name”处或附近的语法错误   第1行:...代码,f.food_code)代码,COALESCE(i.name,f.name)名称,SUM(...

     

错误:列“f.food_code”必须出现在GROUP BY子句中或用于聚合函数   第1行:... LECT SUM(f.qty)used_times,COALESCE(i.ingr_code,f.food_cod ......

     

错误:列“f.name”必须出现在GROUP BY子句中或用于聚合函数   第1行:......(i.ingr_code,f.food_code)代码,COALESCE(i.name,f.name)...

     

错误:列“i.meas”必须出现在GROUP BY子句中或用于聚合函数   第1行:......我,SUM(COALESCE(i.qty,1)* f.qty)数量,COALESCE(i.meas,f ....

     

错误:列“f.meas”必须出现在GROUP BY子句中或用于聚合函数   第1行:...... COALESCE(i.qty,1)* f.qty)数量,COALESCE(i.meas,f.meas)me ...

这个代码很可能与postgreSQL不完全兼容,所以如果有人可以从查询中修复此代码以适合从PostgreSQL系统运行。

1 个答案:

答案 0 :(得分:3)

问题主要是由于PostgreSQL(与大多数其他RDBMS一样,但与MySQL不同)要求所选项目在分组/聚合的查询中进行分组或聚合。尝试:

SELECT SUM(f.qty) used_times,
       COALESCE(i.ingr_code, max(f.food_code)) code,
       COALESCE(i.name, max(f.name)) "name",
       SUM(COALESCE(i.qty, 1) * f.qty) qty,
       COALESCE(max(i.meas), max(f.meas)) meas
  FROM usedfood f LEFT JOIN ingredients i
    ON f.food_code = i.food_code
 GROUP BY i.ingr_code, i.name

SQLFiddle here