【问题标题】:MySQL update query that uses aggregation subquery on the same table在同一张表上使用聚合子查询的 MySQL 更新查询
【发布时间】:2014-07-05 01:34:05
【问题描述】:

我有一个名为“TableA”的表,其中包含“customer_id”和“name”字段。 我添加了一个新字段“ref”。现在我想更新该表,以便将 customer_id=1 的第一项的“ref”字段设置为 1001,customer_id=1 的第二项设置为 1002,等等,customer_id=2 的第一项设置为 1001等。

当然,我得到了预期的 mysql 错误消息“您不能在 FROM 子句中指定目标表 'TableA' 进行更新”。

还尝试使用 (SELECT next_ref FROM (SELECT ... WHERE A_sub.customer_id = A.customer_id) AS A_sub),但是 MySQL 说找不到“A.customer_id”。

这是查询:

更新表 A SET A.ref = ( SELECT COALESCE(MAX(A_sub.ref) +1, 1001) FROM 表 A A_sub WHERE A_sub.`customer_id` = A.`customer_id` ) o.ref 为空;

问题是:这可以在一个查询中完成还是必须使用临时表? 感谢您的帮助!

【问题讨论】:

    标签: mysql sql sql-update circular-dependency


    【解决方案1】:

    是的。你需要使用update/join:

    UPDATE TableA A join
           (SELECT A_sub.`customer_id`, COALESCE(MAX(A_sub.ref) +1, 1001) as newref
            FROM TableA A_sub
            GROUP BY A_sub.`customer_id`
           ) A_Sub
           on A_sub.`customer_id` = A.`customer_id`
      SET A.ref = newref
      WHERE a.ref IS NULL;
    

    编辑:

    如果您想要一个自动递增的 id,我建议您这样定义一个。如果你必须放一个,那么你可以这样做:

    UPDATE TableA A cross join
           (SELECT @rn := coalesce(MAX(A_sub.ref) + 1, 1001) as maxref
            FROM TableA A_sub
           ) vars
      SET A.ref = (@rn := @rn + 1)
      WHERE a.ref IS NULL;
    

    【讨论】:

    • 谢谢戈登。查询结果为 TableA 的所有记录设置了“1001”,这不是我所期望的(在 MySQL 5.1.72 中测试)。有没有办法让 MySQL 在每次更新后从连接中的子选择“更新”数据集?
    猜你喜欢
    • 1970-01-01
    • 2018-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-28
    相关资源
    最近更新 更多