MySQL更新查询在同一个表上使用聚合子查询

时间:2014-05-16 14:35:03

标签: mysql sql sql-update circular-dependency

我有一个名为“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 “找不到。

以下是查询:

UPDATE TableA A
SET A.ref = (
    SELECT COALESCE(MAX(A_sub.ref) +1, 1001)
    FROM TableA A_sub
    WHERE A_sub.`customer_id` = A.`customer_id`
)
WHERE o.ref IS NULL;

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

1 个答案:

答案 0 :(得分:0)

是。您需要使用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;