Har sökt i online-manualen men hittar inte om det i MySQL går att göra en delete på resultatet ifrån en select-sats, alltså något i stil med:
DELETE FROM tabell WHERE EXISTS (SELECT * FROM tabell WHERE... bla bla bla)
???
Databaser & SQLur Databashanterare & SQL
6 svar · 490 visningar · startad av desdecado
Har sökt i online-manualen men hittar inte om det i MySQL går att göra en delete på resultatet ifrån en select-sats, alltså något i stil med:
DELETE FROM tabell WHERE EXISTS (SELECT * FROM tabell WHERE... bla bla bla)
???
Jo, om du har version 4.1 eller senare.
Det beror lite på vilken version av MySQL man använder, eftersom tidigare versioner än 4.1 inte stödjer subqueries.
Generellt sett skulle jag nog ha gjort så här:
DELETE FROM foo WHERE ID IN (SELECT fooid FROM bar)
Mvh
(jag har version 4.1.12)
Jag får tyvär error när jag försöker använda en select på samma tabell som jag vill radera. Syntaxen jag använder är:
delete from ds_search_history
where exists (select *
from ds_search_history as t
where t.search_keyword = ds_search_history.search_keyword
and t.search_timestamp < ds_search_history.search_timestamp)
..jag testade givetvis även din variant, @nders, men det verkar inte fungera. Vad jag egentligen försöker göra är att radera alla dubletter men spara en av posterna. Select-satsen plockar ut alla dessa dubletter som jag vill ha bort.
Mysql har någon begränsning i det att man kan inte ange den tabell man gör delete på i subselecten om jag inte missminner mig.
Det alternativ som står till städes torde då vara att förfara enligt följande
create temporary table t as
select <kolumner>,min(search_timestamp)
from ds_search_history
group by <kolumner>
delete from ds_search_history
insert into ds_search_history
select * from t
Med <kolumner> avses alla kolumner utom search_timestamp
Du får kontrollera syntaxen för att skapa en tabell med hjälp av select då Mysql ej följer standard i detta avseende.
Tack för hjälpen, jag ska kolla upp om det fungerade senare under dagen. Själv har jag kört MS SQL i mååånga år och där är det bara att tuta och köra. =)
Nice, det fungerade, men jag kunde tydligen inte göra en temptabell så det fick bli en "vanlig" istället... :)
Tackar och bockar!