Sql mükerrer kayıtları silmek
Sql Server’da bir tablodaki tekrar eden kayıtları nasıl silebiliriz ?
L_User isminde bir tablo oluşturup tabloya bir kaç kayıt girelim.
- CREATE TABLE [dbo].[L_User] (
- [ColumnId] [int] IDENTITY (1, 1) NOT NULL ,
- [UserName] [char] (10) NULL ,
- [UserPwd] [char] (10) NULL
- ) ON [PRIMARY]
Bu yöntemlerden en kolayı, identity columndan yararlanmaktır. Tekrar eden kayıtları gruplayıp en küçük veya en büyük ID’lerini alıp diğerlerini sileceğiz.
- DELETE FROM L_User WHERE NOT ColumnId IN (
- SELECT MIN(ColumnId) FROM L_User
- GROUP BY UserName,UserPwd
- )
Bu yönteme benzer olarak tabloyu kendisiyle JOIN edip eş kayıtları bulacağız. Eşleşen kayıtların ID’lerinden küçük olanları sileceğiz. Önce, klasik WHERE mantığıyla yapalım.
- DELETE FROM L_User WHERE ColumnId<
- (SELECT MAX(ColumnId) FROM L_User U2
- WHERE L_User.UserName = U2.UserName
- AND L_User.UserPwd = U2.UserPwd)
Bunu INNER JOIN ile ifade edelim.
- DELETE FROM L_User FROM L_User U1 INNER JOIN (
- SELECT MAX(ColumnId)ColumnId,UserName,UserPwd
- FROM L_User
- GROUP BY UserName,UserPwd)U2
- ON U1.UserName=U2.UserName
- WHERE U1.ColumnId < U2.ColumnId
Başka bir yöntem olarak WHILE ile her kayda konumlanarak silelim.
- SET ROWCOUNT 1--Her defasında bir kayıt okunsun
- SELECT 2006--Bir değer select edelim
- WHILE @@ROWCOUNT > 0
- DELETE L_User
- WHERE 1 <
- (SELECT COUNT(*) FROM L_User U2
- WHERE L_User.UserName = U2.UserName
- and L_User.UserPwd = U2.UserPwd)
- SET ROWCOUNT 0--ROWCOUNT'u geri alalım
KAYNAK : http://www.ahmetkaymaz.com/2006/04/21/sqlde-tekrarlanan-kayitlari-silmek/
Yorumlar