我遇到了一个我无法解决的SQL错误。我必须使用几个连接更新表。我试过没有“in”条款,但是没有“工作”。现在使用in子句,这是我的查询:
UPDATE sc_module_architect
SET
item_name="Print Cover Price"
WHERE
item_id IN (
SELECT a.item_id
FROM sc_module_architect a
LEFT JOIN sc_module_architect_category_links l on l.item_id=a.item_id
LEFT JOIN sc_module_architect_category c on c.category_content_id=l.content_id
LEFT JOIN sc_content sc on sc.content_id=l.content_id
WHERE item_active=1
AND content_name LIKE "ed_abc_print%"
LIKE item_name LIKE "Cover Price%");
现在运行时我收到错误
/* SQL Error (1093): You can't specify target table 'sc_module_architect' for update in FROM clause */
无法理解为什么会出现这种情况。有任何想法吗? Mysql 5.5
答案 0 :(得分:2)
您无法同时在子查询中使用更新表:
您需要遵循以下语法:
update tablea JOIN tableb ..... SET columnname='yourvalue' where [....]
尝试以下:
update sc_module_architect as t1 LEFT JOIN (select a.item_id
from sc_module_architect a
left join sc_module_architect_category_links l on l.item_id=a.item_id
left join sc_module_architect_category c on c.category_content_id=l.content_id
left join sc_content sc on sc.content_id=l.content_id
where
item_active=1
and content_name like "ed_abc_print%"
and item_name like "Cover Price%") as t2
on t1.item_id=t2.itemid
set
t1.item_name="Print Cover Price"
答案 1 :(得分:1)
您可以先将所有ID放入临时表中,然后将其用作插入
中的查找CREATE TEMPORARY TABLE tempTable (item_id INT);
INSERT INTO tempTable (item_id)
SELECT a.item_id
FROM sc_module_architect a
LEFT JOIN sc_module_architect_category_links l on l.item_id=a.item_id
LEFT JOIN sc_module_architect_category c on c.category_content_id=l.content_id
LEFT JOIN sc_content sc on sc.content_id=l.content_id
WHERE
item_active=1
AND content_name like "ed_abc_print%"
AND item_name like "Cover Price%";
UPDATE sc_module_architect
SET
item_name="Print Cover Price"
WHERE
item_id in (select item_id from tempTable)
答案 2 :(得分:1)
当您将子查询中的表sc_module_architect设置为'a'时,请使用此
update a
set
item_name="Print Cover Price"
WHERE
item_id in (select a.item_id
from sc_module_architect a
left join sc_module_architect_category_links l on l.item_id=a.item_id
left join sc_module_architect_category c on c.category_content_id=l.content_id
left join sc_content sc on sc.content_id=l.content_id
where
item_active=1
and content_name like "ed_abc_print%"
and item_name like "Cover Price%");
答案 3 :(得分:1)
将条件从WHERE
移至JOIN
。 (那些left
加入似乎不合适。我认为它们应该INNER
加入):
UPDATE sc_module_architect AS ma
JOIN
( SELECT a.item_id
from sc_module_architect a
left join sc_module_architect_category_links l
on l.item_id=a.item_id
left join sc_module_architect_category c
on c.category_content_id=l.content_id
left join sc_content sc on sc.content_id=l.content_id
WHERE content_name LIKE 'ed_abc_print%'
) AS t
ON t.item_id = ma.item_id
SET
ma.item_name = 'Print Cover Price'
WHERE ma.item_active = 1
AND ma.item_name LIKE 'Cover Price%' ;