我已经在我的问题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系统运行。
答案 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。