UPDATE SET =从

时间:2015-06-23 13:37:14

标签: mysql

我正在尝试使用以下选项查询更新表:

UPDATE branches SET name = 
(SELECT CONCAT(comp.name," ",bra.subsurb) as newname 
FROM companies comp 
RIGHT JOIN branches bra 
ON comp.id = bra.company_id)

哪个according to this question应该有用 但这会产生错误:You can't specify target table 'branches' for update in FROM clause

不确定我做错了什么。

编辑:

最终这个查询完成了我之后的事情:

UPDATE branches bra LEFT JOIN companies comp ON comp.id = bra.company_id SET bra.name = CONCAT(comp.name," ",bra.subsurb)

3 个答案:

答案 0 :(得分:3)

错误本身非常自我解释,您从正在更新的表中进行选择。相反,您可以在update语句中使用JOIN。试试这个:

UPDATE branches b
LEFT JOIN companies c ON c.id = b.company_id
SET b.name = CONCAT(c.name, " ", b.subsurb);

请注意,因为您在此处使用左连接来选择所有分支,无论他们是否有公司,您可能会获得某些名称的空值,因此请注意。

答案 1 :(得分:2)

在MySQL中,您无法修改在SELECT部分​​中使用的同一个表。 此行为记录在:http://dev.mysql.com/doc/refman/5.6/en/update.html

您需要停止使用嵌套子查询并分两部分执行操作,或者使用简单的where子句。

如需了解更多信息,请访问以下链接

MySQL Error 1093 - Can't specify target table for update in FROM clause

答案 2 :(得分:0)

您获得的错误是MySQL的限制。

要解决此问题,请首先编写一个SELECT语句,该语句既返回现有列值,又返回要分配给列的新值:

e.g。

  SELECT b.company_id
       , b.name                       AS old_name
       , CONCAT(c.name,' ',b.subsurb) AS new_name
    FROM branches b
    LEFT
    JOIN companies c
      ON c.id = b.company_id

注意:注意为c.name返回的NULL值(可能是因为外连接)。包含NULL的CONCAT可能会返回NULL。

返回要更新的行后,将SELECT ... FROM替换为关键字UPDATE,将其转换为UPDATE,并在SET之前添加WHERE子句1}}子句:

  UPDATE branches b
    LEFT
    JOIN companies c
      ON c.id = b.company_id
     SET b.name = CONCAT(c.name,' ',b.subsurb)