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..
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
Merhaba,
Yorumunuz için teşekkürler.