1
UPDATE item t 

INNER JOIN ( SELECT
               item_name,
               MAX( item_keyword ) AS item_keyword
             FROM item
             WHERE ca_id2  = '2010'
             GROUP BY item_name
           ) s ON t.item_name = s.item_name

SET t.item_keyword = s.item_keyword 

WHERE t.ca_id2 ='3010'

エラーは次のとおりです。

1064 - SQL 構文にエラーがあります。near 'SELECT item_name, max(item_keyword) AS item_keyword FROM item を使用する正しい構文については、MySQL サーバーのバージョンに対応するマニュアルを確認してください。

MySQL バージョン 4.0.22 失敗の理由は何ですか?

4

1 に答える 1

1

http://www.xaprb.com/blog/2006/06/23/how-to-select-from-an-update-target-in-mysql/に基づいてクエリを作成しようとしました

UPDATE item t

SET t.item_keyword =
      ( SELECT MAX( i.item_keyword ) AS item_keyword
          FROM ( SELECT item_keyword, item_name, cd_id2 FROM item ) AS i
         WHERE t.item_name = i.item_name
           AND i.cd_id2  = '2010'
      GROUP BY i.item_name
      )

WHERE t.ca_id2 ='3010'

または、このバージョンも試すことができます

UPDATE item t

INNER JOIN ( SELECT item_keyword, item_name, cd_id2 FROM item ) AS i

SET t.item_keyword =
      ( SELECT MAX( i.item_keyword ) AS item_keyword
          FROM i
         WHERE t.item_name = i.item_name
           AND i.cd_id2  = '2010'
      GROUP BY i.item_name
      )

WHERE t.ca_id2 ='3010'

申し訳ありませんが、私は MySQL 4 を持っていないので、上記のクエリをテストする必要があります。

他の読み方:

上記のクエリが機能しない場合は、副選択の代わりに一時テーブルを使用してみてください。

http://sqlfiddle.com/#!2/13ccb/1

CREATE TEMPORARY TABLE s
   SELECT item_name,
          MAX( item_keyword ) AS item_keyword
    FROM  item
    WHERE cd_id2  = '2010'
      AND item.item_name IN ( SELECT item_name FROM item WHERE item.ca_id2='3010')
GROUP BY item_name;


UPDATE item t 
INNER JOIN s ON t.item_name = s.item_name
SET t.item_keyword = s.item_keyword 
WHERE t.ca_id2 ='3010';

DROP TEMPORARY TABLE s;
于 2012-07-01T12:04:24.113 に答える