Tablodan tekrarlanan (Duplicate) satırları bulma,sıralama ve silme işlemleri

Primary Key veya Unique olmayan bir sütunda birden fazla kaydımız olduğu zaman bu fazlalıkları silmek istediğimizde ne yapacağımızı anlatacağım. Öncelikle aşağıdaki script ile bir tane tablo oluşturup içerisine aşağıdaki verileri basalım. Database seçimi size kalmıştır istediğiniz db'ye basabilirsiniz.


SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[adSoyadTcNo](
	[tc_no] [nvarchar](11) NULL,
	[Ad] [nvarchar](50) NULL,
	[Soyad] [nvarchar](50) NULL
) ON [PRIMARY]
GO
INSERT [dbo].[adSoyadTcNo] ([tc_no], [Ad], [Soyad]) VALUES (N'12314131233', N'Ender', N'Ariç')
GO
INSERT [dbo].[adSoyadTcNo] ([tc_no], [Ad], [Soyad]) VALUES (N'75934123123', N'Mehmet', N'Deneme')
GO
INSERT [dbo].[adSoyadTcNo] ([tc_no], [Ad], [Soyad]) VALUES (N'12314131233', N'Ender', N'Ariç')
GO
INSERT [dbo].[adSoyadTcNo] ([tc_no], [Ad], [Soyad]) VALUES (N'75934123123', N'Mehmet', N'Deneme')
GO
INSERT [dbo].[adSoyadTcNo] ([tc_no], [Ad], [Soyad]) VALUES (N'12314131233', N'Ender', N'ARİÇ')
GO

Burada dikkat ettiyseniz aynı tcno ya sahip birden fazla kayıt bulunmakta. Biz bu kayıtlara ait fazlalıkları manuel olarak silebiliriz. Fakat yüzbinlerce satır arasında bunu yapmamız pek mümkün değil. Doğrudan delete işlemi kullandığımız durumlarda ise tüm kayıtları temizleyebiliriz. Bunu yapmak için en mantıklı yöntem cte (common table expression) içerisinde  row_number ve gruplama kullanmak. Aşağıdaki kod ile önce bir select atarak satır numaralarını görüntüleyebiliriz.


WITH CTE AS(
   SELECT [tc_no],[Ad],[Soyad],RN = ROW_NUMBER()OVER(PARTITION BY [tc_no] ORDER BY [tc_no])
   FROM [dbo].[adSoyadTcNo]
)
SELECT *  FROM CTE

Yukarıdaki işlem ile tc_no ya göre sıralama yaptık. Partition kullanarak tc_nolar değiştiği anda satır numarasını tekrar sıfırladık ve sonunda aşağıdaki görseldeki gibi bir sonuç elde ettik. 

MSSQL Delete duplicate rows

Artık elimizde tanımlanmış satırlar bulunmakta. Yani hangi satırları silebileceğimizi biliyoruz. Yapmamız gereken sadece RN sütunu 1 den büyük olan satırları silmek. Bunun için aşağıdaki kodu çalıştırabiliriz. Bu kodu çalıştırmadan önce transaction kullanmanız tavsiye edilir.

WITH CTE AS(
   SELECT [tc_no],[Ad],[Soyad],RN = ROW_NUMBER()OVER(PARTITION BY [tc_no] ORDER BY [tc_no])
   FROM [dbo].[adSoyadTcNo]
)
DELETE FROM CTE WHERE RN > 1

işlemden sonra artık yinelenen satırları silmek gibi bir derdiniz bulunmamaktadır. Bu yöntem ile özellikle arşivleme yaptığınız tablolardaki tekrarlar ortadan kalkacaktır.

184

(0) Yorum

Yorumlar