1

解決できない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

4

4 に答える 4

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"
于 2012-04-07T08:52:39.230 に答える
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%");
于 2012-04-07T08:46:07.667 に答える
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)
于 2012-04-07T08:31:55.817 に答える
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%' ;
于 2012-04-07T08:51:40.987 に答える