Konuyu Oyla:
  • Derecelendirme: 5/5 - 1 oy
  • 1
  • 2
  • 3
  • 4
  • 5
MS-SQL Server'da tekrar eden (çift, mükerrer) kayıtları tespit etme ve silme.
#1
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.

[Ars=sql]
select
  ROW_ID,
  KOD,
  ROW_NUMBER() OVER(PARTITION BY KOD ORDER BY KOD, ROW_ID) AS SIRA
from
  TBL_STOK
[/ars]

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.

[Ars=sql]
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
[/ars]


3. Ve son aşamada ROW_ID'lerini tespit ettiğimiz kayıtları sileceğiz.

[Ars=sql]
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)
[/ars]


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

[Ars=sql]ROW_NUMBER() OVER(PARTITION BY KOD ORDER BY KOD, ROW_ID DESC) AS SIRA[/ars]

şeklinde yazardık.
WWW
Cevapla
#2
Teşekkürler...
Cevapla
#3
Select ROW_ID, count(KOD) 
From Tablo 
Group By ROW_ID 
HAVING count(KOD)>1

şeklinde sorguda aynı şeyi yapmazmı ?
WWW
Cevapla
#4
(29-01-2018, Saat: 13:22)esistem Adlı Kullanıcıdan Alıntı:
Select ROW_ID, count(KOD) 
From Tablo 
Group By ROW_ID 
HAVING count(KOD)>1

şeklinde sorguda aynı şeyi yapmazmı ?

ROW_ID'ye göre GROUP BY yaptığınız için COUNT(KOD) değeri hiç bir zaman 1'den büyük olamaz. Bu durumda bu kod doğru sonuç üretmez.
WWW
Cevapla
#5
Evet haklısınız jeton geç düşüyor, 
Ama şöyle bir kod çalışabilir sanırım?


SELECT KOD,COUNT(KOD)
FROM tablo
GROUP BY KOD
HAVING COUNT(KOD)>1
WWW
Cevapla
#6
(29-01-2018, Saat: 16:57)esistem Adlı Kullanıcıdan Alıntı: Evet haklısınız jeton geç düşüyor, 
Ama şöyle bir kod çalışabilir sanırım?


SELECT KOD,COUNT(KOD)
FROM tablo
GROUP BY KOD
HAVING COUNT(KOD)>1

Bu şekilde tekrar eden KOD'ların listesini alabilirsiniz. Ama ROW_ID yi almadığınız için hangi kayıtları silmeniz gerektiğini tespit edemezsiniz.
WWW
Cevapla
#7
Bukod biraz yavaş çalışır tek işlem işlem
  Delete UrunHareketleri
  Where IsNull(Id,0) Not In (Select Max(IsNull(Id,0)) 
                               From UrunHareketleri With(NoLock)
                              Group By IdUrun
                            )

Yada birazdaha hizlisi iki işlem halinde

 IF OBJECT_ID('tempdb..#TmpSilinmiyecekler') IS NOT NULL DROP TABLE #TmpSilinmiyecekler
 Select IdUrun, Max(IsNull(Id,0)) As Id
   Into #TmpSilinmiyecekler 
   From UrunHareketleri With(NoLock)
  Group By IdUrun

 Delete UrunHareketleri
  Where IsNull(Id,0) Not In (Select Id 
                               From #TmpSilinmiyecekler
                            )
Bu dünyada kendine sakladığın bilgi ahirette işine yaramaz. 
Cevapla


Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  SQL Server : MySQL : Sayfalama, Pagination uparlayan 10 8.648 12-06-2021, Saat: 01:09
Son Yorum: uparlayan
  Sql Server Veritabanı Bozulmaları Tespit ve Önleme Yöntemleri adelphiforumz 4 3.714 20-01-2020, Saat: 17:08
Son Yorum: Bay_Y
  SQL Server : Trigger hangi kipte çalışıyor uparlayan 10 9.744 18-01-2020, Saat: 09:24
Son Yorum: serdar
  30 Adet MS SQL Server Performans İpucu csunguray 6 5.559 09-10-2019, Saat: 09:19
Son Yorum: csunguray
  SQL Server sp_executesql ile çalıştırılan sorguya tabloyu parametre olarak göndermek sabanakman 6 5.712 17-09-2018, Saat: 12:34
Son Yorum: sabanakman



Konuyu Okuyanlar: 1 Ziyaretçi