2016-05-20 9 views
0
mysql> delete from valeurs_actions where id not in 
    -> (select * from 
    -> (select t1.id from valeurs_actions t1 inner join(select action_id,max(temps_action) as temps_action from valeurs_actions 
    -> group by action_id) as t2 
    -> on t1.action_id=t2.action_id and t1.temps_action=t2.temps_action) 
    -> as id_as); 

を削除するときは、FROM句に更新のターゲット表 'valeurs_actions' を指定することはできません私は削除するには、次を実行しようとしたが、私はエラーを取得:ERROR 1093 (HY000): You can't specify target table 'valeurs_actions' for update in FROM clauseERROR 1093(HY000):MySQLデータベースから

答えて

0
DELETE FROM valeurs_actions v1 -- use different alias here 
WHERE id NOT IN (SELECT t1.id 
        FROM valeurs_actions t1 
        INNER JOIN(SELECT v2.action_id, 
            Max(v2.temps_action) AS temps_action 
          FROM valeurs_actions v2 -- and here 
          GROUP BY v2.action_id 
          ) AS t2 
          ON t1.action_id = t2.action_id 
         AND t1.temps_action = t2.temps_action 
       ); 

注:あなたは1つの付帯番号SELECT * FROMを持っていて、不必要でした。

+0

btw私はこのコードを最適化できると確信していますが、いくつかのサンプルデータと期待される出力が必要です。しかし、後で別の質問を作成する可能性があります。 –

+0

実際には、以前は不要だった「SELECT * FROM」が必要でした。 Oracleが[オプティマイザが5.7の派生テーブルを処理する方法を変更する](https://dev.mysql.com/doc/refman/5.7/en/subquery-optimization.html#derived-table-optimization)の前に奇跡を起こしました。以前は、外部クエリが完全に分析される前に、内部クエリを暗黙的な一時テーブルに具体化するように強制されていました。 'SELECT * FROM(SELECT .../* t1 * /を参照する単一の列を返すクエリ)/ tmp)' –

関連する問題