2011-01-05 8 views
5

Próbuję usunąć wszystkie rekordy, które nie są najnowszą wersją pod ich nazwą, ale najwyraźniej nie możesz odwoływać się do dostępu do tabeli, którą modyfikujesz w tym samym zapytaniu.Rozejrzyj się samo-refencją w zapytaniu DELETE

próbowałem tego, ale to nie działa z powodów wyżej:

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

Jak mogę obejść ten problem?

Cheers

Odpowiedz

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

Dzięki, widziałem ten link i próbował tej metody wcześniej, ale muszę opuściły zagubionej gdzieś wspornik. – DonutReply

+0

właśnie to zauważyłem i edytowałem – DonutReply

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

// stworzenie aliasu jest potrzeba tutaj