2012-04-07 25 views
1

中指定TABLE_NAME我有一個SQL錯誤,我不能解決。我必須用一些連接來更新表格。我試過沒有「in」條款,但沒有成功。運行時,它加入SQL更新 - 不能在第

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

我想你可以加入。 Update-Where有限制。 – 2012-04-07 08:52:46

回答

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" 
+0

嗨@kingfisher你可以解釋一下「你不能在子查詢中使用更新下的表」 – Jason 2012-04-08 01:25:42

+0

意味着你的表在更新「sc_module_architect」下也不能在子查詢中使用。 mysql不允許在同一時間 – 2012-04-08 10:58:40

+0

哦,對,謝謝你的解釋。 +1 – Jason 2012-04-09 03:12:21

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) 
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%"); 
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%' ;