【问题标题】:SQL Error while inserting data into a table向表中插入数据时出现 SQL 错误
【发布时间】:2014-08-14 12:52:42
【问题描述】:

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

【问题讨论】:

  • 我们可以把它的格式设置得更好一点吗?当必须左右滚动时,很难阅读所有查询。
  • 按照错误消息所说的去做,你还有很多其他未分组和未聚合的列。这是 Postgres,而不是带有 GROUP BY 扩展的 MySQL。也许结果不会像预期的那样,但您应该先完成这个 SELECT 工作,然后再尝试使用它进行 INSERT。

标签: mysql sql postgresql


【解决方案1】:

您的查询中有一个潜在的错误,这部分:

coalesce(MAX(csp.id), 0)+1 

可能会在结果行中放置错误(意外)值(我没有检查整个查询,而且您没有显示表结构,所以我不想做任何其他假设):如果子选择返回多个结果,则所有结果都将具有该列的相同值。

我猜你想要 autoincrement 列中的最后一个id(否则,如果可以删除源表中的行,假设所有这些 id 都是PKs):如果是这种情况,请不要使用组函数,而是使用子查询,例如 SELECT id FROM cps ORDER BY id DESC LIMIT 1(未经测试,这只是一个建议)。

除此之外,我认为您最好重新考虑您想要实现的目标,然后您可能会编写不同的查询。

【讨论】:

    【解决方案2】:

    所以,当您 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;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-06-20
      • 2017-01-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-26
      • 1970-01-01
      • 2019-11-26
      相关资源
      最近更新 更多