我正在尝试使用以下选项查询更新表:
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)
答案 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)