2013-12-04 4 views
0

Я хочу запустить некоторые обновления в моей базе данных MySQL. Вот запрос, который я хочу использовать:Обновление MySQL с предложением IN и подзапросом

UPDATE `wphh_wp_eStore_tbl` 
SET `wphh_wp_eStore_tbl`.description = '<div class="dwrp"> 
<h2>F. Locker $109.99</h2> 
<h2>Nike Outlet $109.99</h2> 
<h2>Ch. Sports $107.99</h2> 
<h2>Hoopers Hookup $89.99</h2> 
<h2 class="special">These prices as of 11/20/13</h2>' 
WHERE `wphh_wp_eStore_tbl`.id in (
    SELECT `wphh_wp_eStore_tbl`.id FROM `wphh_wp_eStore_tbl` 
    INNER JOIN `wphh_wp_eStore_cat_prod_rel_tbl` 
     on `wphh_wp_eStore_cat_prod_rel_tbl`.prod_id = `wphh_wp_eStore_tbl`.id 
    WHERE `wphh_wp_eStore_cat_prod_rel_tbl`.cat_id = 5 
    ) 

Это порождает следующую ошибку:

#1093 - You can't specify target table 'wphh_wp_eStore_tbl' for update in FROM clause

Почему? Я знаю в MSSQL. Я могу это сделать:

Update tableone 
set columnname = 'xxx' 
where id in (
    select id 
    from tableone 
    where category = 10) 

и он работает.

Что мне не хватает?

ответ

1

Простым решением является включение списка in в дополнительный уровень вложенности. MySQL будет материализовать данные:

UPDATE `wphh_wp_eStore_tbl` 
SET `wphh_wp_eStore_tbl`.description = '<div class="dwrp"> 
<h2>F. Locker $109.99</h2> 
<h2>Nike Outlet $109.99</h2> 
<h2>Ch. Sports $107.99</h2> 
<h2>Hoopers Hookup $89.99</h2> 
<h2 class="special">These prices as of 11/20/13</h2>' 
WHERE `wphh_wp_eStore_tbl`.id in (
    select * from (SELECT `wphh_wp_eStore_tbl`.id FROM `wphh_wp_eStore_tbl` 
INNER JOIN `wphh_wp_eStore_cat_prod_rel_tbl` on     `wphh_wp_eStore_cat_prod_rel_tbl`.prod_id = `wphh_wp_eStore_tbl`.id 
WHERE 
`wphh_wp_eStore_cat_prod_rel_tbl`.cat_id = 5) t 
    ) 

Другой способ заключается в использовании join, чтобы с update.

+0

Спасибо! Это прекрасно сделал трюк! –

0

Я не парень MySQL, но вы могли бы сделать это вместо этого? Мне также нравится использовать псевдоним таблицы с этими уродливыми именами.

UPDATE `wphh_wp_eStore_tbl` e 
inner join `wphh_wp_eStore_cat_prod_rel_tbl` ecpr 
    on ecpr.prod_id = e.id 
    and ecpr.cat_id = 5 
set e.description = 'Some Text To Update With' 

В SQL Server «из» и соединение приходят после SET, но, возможно, не в случае с mySQL.

Смежные вопросы