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. Hej, hittade en artikel som kanske hjälper dig vidare? <code>DELETE FROM kunder WHERE kundid 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. 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 ;)Radera dubbletter men spara senast skapade
<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?Sv: Radera dubbletter men spara senast skapade
http://support.microsoft.com/kb/139444
Ett annat exempel är:
http://www.4guysfromrolla.com/ASPScripts/PrintPage.asp?REF=%2Fwebtech%2Fsqlguru%2Fq051200-2.shtml
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
-- 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
Sv: Radera dubbletter men spara senast skapade
NOT IN
(SELECT max(kundid) FROM kunder GROUP BY epost )</code>
//AnnSv: Radera dubbletter men spara senast skapade
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 ;-)Sv:Radera dubbletter men spara senast skapade