23 Temmuz 2015 Perşembe

Unique olmayan kayıtları topluca silmek (bulk delete non-unique records)

Merhaba arkadaşlar,

Bu yazımda, tabloda Unique olmayan kayıtları toplu olarak silmeyi ele alacağım. Üzerinde çalışacağımız senaryoda, kayıtları daha önce gelişigüzel girilmiş, AirPortCode ve AirPortName adında alanları bulunan bir tablom var. AirPortCode alanı unique olması icab eden bir alan ancak tablo bu şekilde yapılandırılmamış ve bir çok mükerrer kayıt girişi yapılmış. Şu durumda Management Studio(SSMS) ortamında AirportCode alanını primary key yapmak istediğimde SSMS aşağıdaki hatayı dönmekte;

 'AirPorts' table
- Unable to create index 'PK_AirPorts'.
The CREATE UNIQUE INDEX statement terminated because a duplicate key was found for the object name 'dbo.AirPorts' and the index name 'PK_AirPorts'. The duplicate key value is (BAY).
Could not create constraint. See previous errors.
The statement has been terminated.


Yani alanın primary key olmasına engel teşkil eden mükerrer ilk kaydı gösterip işlemi yapamadığını söylüyor.

zahmetli de olsa, her bir hata için mükerrer tablo kayıtlarını edit modda açıp silmek istediğimde ise;

---------------------------
Microsoft SQL Server Management Studio
---------------------------
No rows were deleted.

A problem occurred attempting to delete row 1.
Error Source: Microsoft.SqlServer.Management.DataTools.
Error Message: The row value(s) updated or deleted either do not make the row unique or they alter multiple rows(2 rows).

Correct the errors and attempt to delete the row again or press ESC to cancel the change(s).
---------------------------
OK   Help  
---------------------------


silmek istenen kayıttan birebir aynı birden fazla kayıt olduğundan işlemi bu yöntemle de gerçekleştiremiyoruz.


--mükerrer haavalanlarını ve adetlerini tutacağımız değişkenlerimizi tanımlıyoruz.
declare @AirPortCode varchar(3), @AirPortCount int
--mükerrer kayıt kalmayana kadar döngü çalışacak. işlemi cursor kullanarak ta yapabilirsiniz.
while exists(select null from AirPorts group by AirPortCode having COUNT(AirPortCode)>1)
begin
/*mükerrer havaalanı ve ilgili havaalanının mükerrer kayıt sayısı bulunuyor.
kayıt sayısının 1 eksigini alarak tabloda tek kayıt kalmasını sağlamış oluyoruz.
*/

select @AirPortCode = AirPortCode, @AirPortCount = COUNT(AirPortCode) - 1
from AirPorts group by AirPortCode having COUNT(AirPortCode)>1
--bulunan değer kadar kaydı siliyoruz
delete top (@AirPortCount) from AirPorts where AirPortCode = @AirPortCode
end;


artık AirportCode alanını primary key olarak atayabiliriz. Tablo ve data scriptini buradan indirebilirsiniz.

faydalı olması dileğimle,

bir sonraki yazımda görüşmek üzere,
Yaşar Şahin






Hiç yorum yok:

Yorum Gönder