2012-04-07 5 views
1

У меня возникла ошибка sql, которую я не могу решить. Мне нужно обновить таблицу несколькими парами соединений. Я попытался сделать это без предложения «in», но это не помогло. Теперь с пунктом, вот запрос у меня есть:SQL Update with join - cant указать TABLE_NAME из раздела

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

Привет @kingfisher вы можете объяснить «Вы также можете использовать таблицу под обновлением в подзапросе одновременно» – Jason

+0

Обозначает, что ваша таблица под обновлением «sc_module_architect» также не используется в подзапросе. mysql не позволяет это в то же время –

+0

О, да, спасибо за это объяснение. +1 – Jason

1

Вы можете поместить все Идентификаторы во временную таблицу первого затем использовать его в качестве поиска во вставке

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 в подзапросе как «а» затем использовать эту

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