Radera dubbletter men spara senast skapade
I en tabell (kunder) kan samma kund (samma epostadress) förekomma flera gånger. Det jag vill göra är att radera alla dubbletter utom den senast skapade (den med högst kundid). Jag identifierar alltså dubbletter via e-postadressen.
<code>DELETE FROM kunder WHERE kundid IN (SELECT MIN(kundid) FROM kunder GROUP BY epost HAVING COUNT(*)>1 )</code>
Koden ovan fungerar inte riktigt tillfredsställande då det kan finnas kunder som förekommer > 2 grr. Tips på bättre SQL mottages tacksamt?
Svara
Sv: Radera dubbletter men spara senast skapade
Hej, hittade en artikel som kanske hjälper dig vidare?
http://support.microsoft.com/kb/139444
Ett annat exempel är:
http://www.4guysfromrolla.com/ASPScripts/PrintPage.asp?REF=%2Fwebtech%2Fsqlguru%2Fq051200-2.shtml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | DELETE FROM Foo1 WHERE Foo1.ID IN -- List 1 - all rows that have duplicates ( SELECT F.ID FROM Foo1 AS F WHERE Exists ( SELECT Field1, Field2, Count (ID) FROM Foo1 WHERE Foo1.Field1 = F.Field1 AND Foo1.Field2 = F.Field2 GROUP BY Foo1.Field1, Foo1.Field2 HAVING Count (Foo1.ID) > 1)) AND Foo1.ID NOT IN -- List 2 - one row from each set of duplicate ( SELECT Min (ID) FROM Foo1 AS F WHERE Exists ( SELECT Field1, Field2, Count (ID) FROM Foo1 WHERE Foo1.Field1 = F.Field1 AND Foo1.Field2 = F.Field2 GROUP BY Foo1.Field1, Foo1.Field2 HAVING Count (Foo1.ID) > 1) GROUP BY Field1, Field2); |
Eller detta exempel:
http://www.sqlteam.com/article/deleting-duplicate-records
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | -- Add a new column -- In real life I''d put an index on it Alter table dup_authors add NewPK int NULL go -- populate the new Primary Key declare @intCounter int set @intCounter = 0 update dup_authors SET @intCounter = NewPK = @intCounter + 1 -- ID the records to delete and get one primary key value also -- We''ll delete all but this primary key select au_lname, au_fname, city, state, RecCount= count (*), PktoKeep = max (NewPK) into #dupes from dup_authors group by au_lname, au_fname, city, state having count (*) > 1 order by count (*) desc , au_lname, au_fname -- delete dupes except one Primary key for each dup record delete dup_authors from dup_authors a join #dupes d on d.au_lname = a.au_lname and d.au_fname = a.au_fname and d.city = a.city and d.state = a.state where a.NewPK not in ( select PKtoKeep from #dupes) -- remove the NewPK column ALTER TABLE dup_authors DROP COLUMN NewPK go drop table #dupes |
Svara
Sv: Radera dubbletter men spara senast skapade
<code>DELETE FROM kunder WHERE kundid
NOT IN
(SELECT max(kundid) FROM kunder GROUP BY epost )</code>
//Ann
Svara
Sv: Radera dubbletter men spara senast skapade
Det verkar som Ann''s enkla kod verkar fungera på det sätt som jag önskar. Har inte testat och validerat ordentligt ännu utan bara gjort en snabb körning av scriptet och kastar ett "getöga" på resultatet. Tackar för snabba svar.
pelle: varför kan man inte editera inlägg direkt när man gått till förhandsgranskning? Riktigt i-landsproblem att behöva klicka en gång extra för att kunna editera ;-)
Svara
Sv:Radera dubbletter men spara senast skapade
Fredrik, det är för att jag behöver skriva om och formatera om vissa saker i texten, exempelvis code-taggen som blir en pre-tag med inställningar istället och postar man pre-taggen blir det fel på andra ställen, så därför är förhandsgranskningen "read-only". Du får se det positivt, det fanns inte i förra versionen ;)
Svara