Sorunun cevabını üç aşamada izah edeceğim. Tablomuzun TBL_STOK, primary key'imizin ROW_ID ve tekrarlarını silmek istediğimiz sütunumuzun KOD olduğunu varsayalım.
1. Bu aşamada çift olan kayıtları tespit edeceğiz. Bunun için kayıtları KOD sırasına göre dizeriz ve KOD sahasını kendi içinde numarandırırız. Bu işlem için ROW_NUMBER() fonksiyonundan faydalanacağız.
Kod: Tümünü seç
select
ROW_ID,
KOD,
ROW_NUMBER() OVER(PARTITION BY KOD ORDER BY KOD, ROW_ID) AS SIRA
from
TBL_STOK
Bu sorgunun sonucuna bakarsanız tekrar eden KOD sahalarında SIRA isimli sütunun değerinin 2 olduğunu görürsünüz.
2. Bu aşamada bir alt sorgu ile SIRA sütunu 2 ve daha büyük olan satırlarımızın listesini alacağız.
Kod: Tümünü seç
select
ROW_ID
from
(
select
ROW_ID,
KOD,
ROW_NUMBER() OVER(PARTITION BY KOD ORDER BY KOD, ROW_ID) AS SIRA
from
TBL_STOK
) TBL1
WHERE
SIRA > 1
3. Ve son aşamada ROW_ID'lerini tespit ettiğimiz kayıtları sileceğiz.
Kod: Tümünü seç
delete from
TBL_STOK
where
ROW_ID in (
select
ROW_ID
from
(
select
ROW_ID,
KOD,
ROW_NUMBER() OVER(PARTITION BY KOD ORDER BY KOD, ROW_ID) AS SIRA
from
TBL_STOK
) TBL1
WHERE
SIRA > 1)
Bu işlemde ROW_ID'si en küçük olan kaydı koruyup diğer kayıtları sildiğimize dikkat edin. Eğer tam tersi şekilde ROW_ID'si en büyük olanı koruyup küçük kayıtları silmek isteseydik ROW_NUMBER fonksiyonumuzu
Kod: Tümünü seç
ROW_NUMBER() OVER(PARTITION BY KOD ORDER BY KOD, ROW_ID DESC) AS SIRA
şeklinde yazardık.