MySQL - 使用INNER SELECT更新

时间:2012-02-15 11:52:55

标签: mysql select sql-like

我想做这样的事情,但似乎我不能这样做:

UPDATE products p2
SET
manufacturer = 
(
SELECT manufacturer
FROM products p, manufacturers m, etc.
WHERE
...other stuff...
p.name LIKE CONCAT('%',m.name,'%')    
AND p.id = p2.id
)
WHERE manufacturer = 0

错误是:     #1093 - 您无法在FROM子句

中为更新指定目标表'p2'

问题是我在表中有一个制造商字段,但有些制造商名称在product_name-string而不是制造商字段中,所以我必须通过product_name获取制造商ID并更新产品 - 列出其制造商ID。

我可以通过两个步骤完成此操作,但我喜欢在一个步骤中执行此操作。

4 个答案:

答案 0 :(得分:3)

尝试此查询 -

UPDATE products p
  JOIN manufacturers m
    ON LOCATE(p.name, m.name) > 0
SET p.manufacturer = m.id;

...但首先检查记录是否正确连接 -

SELECT * FROM products p
  JOIN manufacturers m
    ON LOCATE(p.name, m.name) > 0 -- bind records in two tables

答案 1 :(得分:2)

http://dev.mysql.com/doc/refman/5.0/en/subquery-errors.html上有关此同一错误的评论说,“如果您同时使用子查询读取相同数据,则MySQL不允许更新或删除表格数据。”

答案 2 :(得分:0)

查看此类查询是否适合您

UPDATE products p2 INNER JOIN manufacturers m ON m.product_id = p2.id AND p2.name LIKE CONCAT('%',m.name,'%') SET manufacturer = YOURVALUE

您可能必须根据我的假设

修改上述查询

答案 3 :(得分:0)

一个有效的表的示例:

此语句将所有AKTIV记录移至DEAKTIV 已经存在匹配的DRAFT记录的地方:

update table1 fa inner join table1 fe on (fa.datum = fe.datum and fa.firmenid = fe. firmenid and  fe.status = 'DRAFT')
set fa.status = 'DEACTIV'
where fa.firmenid = '+49151506292' and fa.status = 'ACTIV';

执行上述声明后,我只需更新DRAFT-records ton ACTIV并提交