Konuyu Paylaş : facebook gplus twitter

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.

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.

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.

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

ROW_NUMBER() OVER(PARTITION BY KOD ORDER BY KOD, ROW_ID DESC) AS SIRA

ş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ı ?
Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol
WWW
Cevapla
#4
(29-01-2018, Saat: 13:22)esistem Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol
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
Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol
WWW
Cevapla
#6
(29-01-2018, Saat: 16:57)esistem Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Giriş yap veya Üye OlEvet 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

Konuyu Paylaş : facebook gplus twitter



Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  SQL Server sp_executesql ile çalıştırılan sorguya tabloyu parametre olarak göndermek sabanakman 6 205 17-09-2018, Saat: 12:34
Son Yorum: sabanakman
  SQL Server : Tablolar için parametrik sıralı alan listesi uparlayan 6 806 16-07-2018, Saat: 18:36
Son Yorum: ssahinoglu
  SQL Server : MySQL : Sayfalama, Pagination uparlayan 8 316 25-06-2018, Saat: 13:15
Son Yorum: klavye
  SQL Server : Tablo Değişkeni Kullanımı (Running Total, Yürüyen Bakiye Örneği) uparlayan 5 616 22-03-2018, Saat: 12:28
Son Yorum: hi_selamlar
  Datasnap + Rest Server -> Evrensel Veri Adaptörü - 001 - Sunucu Uygulaması mad85 7 808 17-11-2017, Saat: 22:56
Son Yorum: mad85



Konuyu Okuyanlar: 1 Ziyaretçi