将数据插入表时出现SQL错误

时间:2014-08-14 12:52:43

标签: mysql sql postgresql

我试图在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时,它会给出上面提到的错误。

2 个答案:

答案 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;