2011-01-05 12 views
5

Sto tentando di eliminare tutti i record che non sono l'ultima versione sotto il loro nome ma apparentemente non è possibile fare riferimento all'accesso a una tabella che si sta modificando nella stessa query.Come aggirare il self-refencing in una query DELETE

Ho provato questo ma non funziona per i motivi di cui sopra:

DELETE FROM table 
WHERE CONCAT(name, version) NOT IN (
SELECT CONCAT(name, MAX(version)) 
FROM table 
GROUP name 
) 

come posso ottenere intorno a questo?

Acclamazioni

risposta

7

Wrap the inner reference in a derived table.

DELETE FROM table 
WHERE Concat(name, version) NOT IN (SELECT nv 
            FROM (SELECT Concat(name, Max(version)) 
                AS nv 
              FROM table 
              GROUP BY name) AS derived) 
+1

Grazie, avevo visto quel link e provato questo metodo prima, ma devo aver lasciato una staffa fuori luogo da qualche parte. – DonutReply

+0

appena notato e modificato – DonutReply

1
delete t1 
from table_name1 t1, table_name1 t2 
where t1.version < t2.version 
and t1.name = t2.name; 

// crea alias è la necessità qui

Problemi correlati