2016-05-20 8 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); 

Ich habe versucht, folgende löschen zu laufen, aber ich habe den Fehler: ERROR 1093 (HY000): You can't specify target table 'valeurs_actions' for update in FROM clauseERROR 1093 (HY000): Sie können nicht Zieltabelle 'valeurs_actions' angeben für die Aktualisierung in FROM-Klausel, wenn sie von Mysql-Datenbank zu löschen

Antwort

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 
       ); 

HINWEIS: Sie hatten eine zusätzliche SELECT * FROM und war unnötig.

+0

BTW Ich bin sicher, dass dieser Code optimiert werden kann, aber wir benötigen einige Beispieldaten und die erwartete Ausgabe, um das zu tun. Aber Sie können später eine andere Frage erstellen –

+0

Eigentlich wurde das "unnötige" äußere "SELECT * FROM" früher benötigt; es hat Wunder bewirkt, bevor Oracle [die Art, wie der Optimierer abgeleitete Tabellen in 5.7 behandelt] (https://dev.mysql.com/doc/refman/5.7/en/subquery-optimization.html#derived-table-optimization). Zuvor wurde die innere Abfrage in eine implizite temporäre Tabelle umgewandelt, bevor die äußere Abfrage vollständig analysiert wurde. Auf diese Weise können Sie auf die gleiche Tabelle verweisen, in der Sie andernfalls nicht z. 'DELETE FROM t1 WHERE c1 IN (SELECT * FROM (SELECT .../* eine Abfrage, die eine einzelne Spalte zurückgibt, die ebenfalls auf t1 * /) tmp verweist)' –