SQL Server – How To Remove Duplicate Records From A Table

By | 9 July 2013

Merhaba,

SQL Server üzerinde bir tabloda çift kayıt olduğunu düşünüyorsunuz ve bunları temizlemek istiyorsunuz ama nasıl yapabileceğinizi bilmiyorsunuz.  İşte size bu makalede bu konuyu anlatacağım.

Örnek vererek devam edelim konuya ,DuplicateRecords isiminde bir tablonuz var bu tablonuzun içerisinde 1 er 1 er artan bir ID alanı birde Value değerlerini barındıran bir field mevcut. Şimdi bu tablonun içerisine örnek kayıtlar ile dolduralım..

create table DuplicateRecords(ID int identity(1,1),Value int)
declare @sayi int = 0
while @sayi<50
begin
insert into DuplicateRecords values(RAND() *20)
set @sayi = @sayi + 1
end

Yukarıdaki kod ile DuplicateRecords isiminde table create ettik. 1-20 kayıt arasında 50 kayıt insert ediyoruz.  Oluşturduğumuz table’a select sorgusu ile görüntülediğimizde karşımıza tekrar eden kayıtların bulunduğu bir table elde etmiş olacağız.

Çift kayıtları görmek için ;

select Value,count(*) TekrarSayisi from DuplicateRecords
group by Value

Buraya kadar tekrar eden kayıtların olduğu tablomuzu elde ettik. Şimdi ise bu çift kayıtları temizleyebileceğimiz sorgumuzu yazalım.

DECLARE @Value int
DECLARE @Count INT

DECLARE CUR_DELETE CURSOR FOR
SELECT Value,COUNT(*) FROM DuplicateRecords GROUP BY Value HAVING COUNT(*) > 1
OPEN CUR_DELETE
FETCH NEXT FROM CUR_DELETE INTO @Value,@COUNT
WHILE @@FETCH_STATUS = 0
BEGIN
DELETE TOP(@COUNT -1) FROM DuplicateRecords WHERE Value = @Value
FETCH NEXT FROM CUR_DELETE INTO @Value,@COUNT
END
CLOSE CUR_DELETE
DEALLOCATE CUR_DELETE

 

Yukarıdaki sorgu ile cursor oluşturup kayıtlar içerisinde dönerek delete top ile silme işlemini gerçekleştiriyoruz..

Share

2 thoughts on “SQL Server – How To Remove Duplicate Records From A Table

  1. İsmail

    Merhaba,
    Cursor kullanımına alternatif olarak aşağıdaki gibi deneyebilirsiniz.

    with dupRecords as(
    select Id,Value,ROW_NUMBER() over (partition by value order by Id) s from DuplicateRecords
    )
    delete from dupRecords where s>1

    Reply

Leave a Reply

Your email address will not be published. Required fields are marked *