我试图在Postgres中执行以下查询: -
INSERT INTO customer_specific_price (id, user_id, model_map_id , start_date ,
price_model_id,precedence )
SELECT coalesce(MAX(csp.id), 0)+1 , cp.user_id, eipm.id , pipt.start_date,
pipt.price_model_id , pi.precedence
FROM customer_specific_price csp, customer_price cp, plan_item pi ,
plan_item_price_timeline pipt , entity_item_price_map eipm
WHERE cp.plan_item_id = pi.id and pipt.plan_item_id = cp.plan_item_id and
pi.plan_id is Null and pi.item_id = eipm.item_id
给出错误
错误:列“cp.user_id”必须出现在GROUP BY子句中或用于聚合函数。
当表格中没有任何id列时,它工作正常。但是当我添加id并使用coalesce(MAX(csp.id), 0)+1
时,它会给出上面提到的错误。
答案 0 :(得分:0)
您的查询中存在潜在错误,这篇文章:
coalesce(MAX(csp.id), 0)+1
可能会在结果行中放置错误的(意外)值(我没有检查整个查询,加上你没有显示表结构,所以我不想做任何其他假设):if子选择返回多个结果,然后所有结果都将具有该列的相同值。
我想你想要 autoincrement 列中的最后一个id
(否则,如果可以删除源表中的行,则可能会在目标表中发生id冲突,假设所有这些ID是PK):如果是这种情况,请不要使用组函数,而是使用子查询,例如SELECT id FROM cps ORDER BY id DESC LIMIT 1
(未经测试,这只是建议)。
除此之外,我认为你会更好地重新思考你想要实现的目标,然后你可能会写一个不同的查询。
答案 1 :(得分:0)
因此,当您added the id and used coalesce(MAX(csp.id), 0)+1
时,您会收到错误消息ERROR: column "cp.user_id" must appear in the GROUP BY clause or be used in an aggregate function.
这是因为只要您引入了聚合函数(MAX
,在您的情况下),其他列还应该包含聚合函数(MAX,SUM,COUNT等),或者它们应该用于在查询结尾处使用GROUP BY
子句进行分组。 Here是GROUP BY的简要教程。
因此,您的查询可以被其他列重写为分组,如下所示:
INSERT INTO customer_specific_price (id, user_id, model_map_id , start_date ,
price_model_id,precedence )
SELECT coalesce(MAX(csp.id), 0)+1 , cp.user_id, eipm.id , pipt.start_date,
pipt.price_model_id , pi.precedence
FROM customer_specific_price csp, customer_price cp, plan_item pi ,
plan_item_price_timeline pipt , entity_item_price_map eipm
WHERE cp.plan_item_id = pi.id and pipt.plan_item_id = cp.plan_item_id and
pi.plan_id is Null and pi.item_id = eipm.item_id
GROUP BY cp.user_id, eipm.id, pipt.start_date, pipt.price_model_id, pi.precedence;