ADOQuery ile yinelenen kayıtları silme

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
VCLcan
Üye
Mesajlar: 15
Kayıt: 09 Şub 2017 12:27

ADOQuery ile yinelenen kayıtları silme

Mesaj gönderen VCLcan »

Değerli hocalarım,
Yinelenen kayıtları nasıl silebilirim?

Kod: Tümünü seç

begin
son := ''; 
ilk:='';

data.ADOQuery1.SQL.Clear;
data.ADOQuery1.SQL.Add('Select * From Yazarlar');
data.ADOQuery1.SQL.Add('Order By YazarAdi'); 
data.ADOQuery1.Open;
data.ADOQuery1.First;

While not data.ADOQuery1.EOF do begin 

son := data.ADOQuery1.FieldByName('YazarAdi').Value;
if son = ilk then 
data.ADOQuery1.Delete;
ilk := son;
data.ADOQuery1.Next ;

End;
data.ADOQuery1.Close;
end;
bu kod sadece tabloyu baştan sona bir kez okuduğu için birer kayıt siliyor.
ben Bütün kayıtlardan bir adet kalacak şekilde tüm yinelenen kayıtları silmek istiyorum.

şimdiden teşekkürler...
mkysoft
Kıdemli Üye
Mesajlar: 3103
Kayıt: 26 Ağu 2003 12:35
Konum: Berlin
İletişim:

Re: ADOQuery ile yinelenen kayıtları silme

Mesaj gönderen mkysoft »

Aşağıdaki gibi bir yapı çoğu veritabanında iş görecektir. Sorgu sonucunu tekrar çalıştırmanız gerekecek.

Kod: Tümünü seç

select CONCAT("delete from Yazarlar where YazarAdi ='",YazarAdi,"' LIMIT ",Adet-1) from
(select YazarAdi,COUNT(YazarAdi) as Adet from Yazarlar GROUP BY YazarAdi) as t
where Adet > 1
VCLcan
Üye
Mesajlar: 15
Kayıt: 09 Şub 2017 12:27

Re: ADOQuery ile yinelenen kayıtları silme

Mesaj gönderen VCLcan »

Üstat cevabın için sağ olasın. Lakin hata verdi. yabancı forumlarda da farklı çözümler var. Bir ara onları deneyeceğim.
mkysoft
Kıdemli Üye
Mesajlar: 3103
Kayıt: 26 Ağu 2003 12:35
Konum: Berlin
İletişim:

Re: ADOQuery ile yinelenen kayıtları silme

Mesaj gönderen mkysoft »

Kullandığınız veri tabanını yazmadığınız için genel bir mantık yazdım MySQL için sadece. Kullandığınız veri tabanında LIMIT yoktur muhtemelen.
Kullanıcı avatarı
csunguray
Üye
Mesajlar: 855
Kayıt: 09 Ara 2006 05:08
Konum: Adana
İletişim:

Re: ADOQuery ile yinelenen kayıtları silme

Mesaj gönderen csunguray »

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.
C. Sunguray
csunguray at netbilisim.kom
Net Bilişim Hizmetleri

Sıradan her programcı bilgisayarın anlayabileceği kodlar yazabilir.
Sadece iyi programcılar insanların da anlayabileceği kodlar yazarlar.
Martin Fowler (http://martinfowler.com/)
VCLcan
Üye
Mesajlar: 15
Kayıt: 09 Şub 2017 12:27

Re: ADOQuery ile yinelenen kayıtları silme

Mesaj gönderen VCLcan »

mkysoft ve csunguray hocalarım çok teşekkür ederim. Bu soru ve cevap da tarihe not olarak düşsün. Umarım ihtiyacı olan başkaları da olur ve faydalanırlar.
Cevapla