Red Kit

WFN Üye
Konular
580
Mesajlar
580
Çözüm
0
Ticaret Puanı
0
Üyelik
23 Gün
Konum
Adana
Web Sitesi
Var
Alanı
Makale Yazarı
1/1
Konu sahibi
İstenen sütunlarda aynı değerleri taşıyan kayıtları bulmak için GROUP BY ile gruplama yapıp HAVING COUNT(*) > 1 koşulunu kullanın. Örneğin e-posta adresi tekrarlarını bulmak için sorgu, her e-posta değerini bir kez listeler ve iki veya daha fazla kez geçenleri gösterir. Tekrarlanan kayıtların tüm sütunlarını görmek istiyorsanız önce tekrar eden anahtarları belirleyip bunları asıl tabloyla birleştirin veya pencere işlevi kullanın.

Belirli bir sütundaki tekrarları bulma​


Varsayımsal olarak kullanicilar adlı tabloda email sütununun benzersiz olması gerektiğini düşünelim. Aynı e-posta adresinin birden fazla kayıtta bulunup bulunmadığını şu sorguyla kontrol edebilirsiniz:

SQL:
SELECT
    email,
    COUNT(*) AS tekrar_sayisi
FROM kullanicilar
GROUP BY email
HAVING COUNT(*) > 1;

GROUP BY email, aynı e-posta değerlerini tek bir grup altında toplar. COUNT(*) her grubun kaç kayıttan oluştuğunu sayar. HAVING COUNT(*) > 1 ise yalnızca birden fazla kaydı bulunan grupları bırakır.

Örneğin sonuçta [email protected] için tekrar_sayisi = 3 görünüyorsa bu değer tabloda üç kayıtta yer alıyor demektir. Bu sonuç, kayıtların kesinlikle hatalı olduğunu tek başına kanıtlamaz; aynı e-posta adresinin aynı aileye, kuruma veya birden fazla üyelik işlemine ait olması tasarım gereği mümkün olabilir. Sonraki adımda bu tekrarların iş kuralına göre geçerli mi yoksa veri hatası mı olduğunu kontrol etmelisiniz.

Birden fazla sütuna göre tekrar arama​


Tekrar ölçütü tek bir sütun değil, birkaç sütunun birlikte oluşturduğu değer olabilirse tüm bu sütunları GROUP BY içine ekleyin. Örneğin aynı müşterinin aynı tarihte aynı ürünü birden fazla kez alıp almadığını kontrol etmek için:

SQL:
SELECT
    musteri_id,
    urun_id,
    siparis_tarihi,
    COUNT(*) AS tekrar_sayisi
FROM siparisler
GROUP BY musteri_id, urun_id, siparis_tarihi
HAVING COUNT(*) > 1;

Burada yalnızca üç sütunun birlikte aynı olduğu gruplar bulunur. Aynı musteri_id değerinin farklı ürünlerde veya farklı tarihlerde bulunması tekrar kabul edilmez. Bu ayrım önemlidir; yanlış sütunlarla gruplama yaparsanız geçerli kayıtları da tekrar sanabilirsiniz.

Tekrarlanan kayıtların tüm bilgilerini listeleme​


GROUP BY sorgusu genellikle tekrar eden sütunları ve tekrar sayısını gösterir. Tekrarlanan satırların kimlik, oluşturulma zamanı veya diğer alanlarını da görmek için gruplama sonucunu tabloyla birleştirebilirsiniz:

SQL:
SELECT k.*
FROM kullanicilar AS k
INNER JOIN (
    SELECT email
    FROM kullanicilar
    GROUP BY email
    HAVING COUNT(*) > 1
) AS tekrarlar
    ON tekrarlar.email = k.email
ORDER BY k.email, k.id;

İç sorgu, birden fazla kez geçen e-posta adreslerini bulur. INNER JOIN ise bu adreslere sahip tüm asıl kayıtları getirir. Böylece hangi satırların tekrar grubuna girdiğini, kimliklerini ve diğer alanlarını karşılaştırabilirsiniz.

Bu sorgunun sonucu boşsa seçtiğiniz sütunlara göre birden fazla kayıt bulunamamıştır. Bu, tabloda hiçbir alanın benzemediğini değil, yalnızca kullandığınız tekrar ölçütüne göre çakışma olmadığını gösterir. Örneğin email ile sonuç alamazken telefon veya musteri_id, urun_id birlikte kullanıldığında tekrar bulabilirsiniz.

NULL değerlerini yorumlama​


GROUP BY, aynı sütundaki NULL değerlerini aynı grup altında değerlendirebilir. Bu nedenle yukarıdaki sorgu, birden fazla NULL içeren grubu tekrar olarak gösterebilir. Ancak NULL, bilinmeyen veya henüz girilmemiş değer anlamına gelir; bu kayıtların aynı e-posta adresine sahip olduğunu kanıtlamaz.

Eksik değerleri tekrar kontrolüne katmak istemiyorsanız koşulu gruplamadan önce ekleyin:

SQL:
SELECT
    email,
    COUNT(*) AS tekrar_sayisi
FROM kullanicilar
WHERE email IS NOT NULL
GROUP BY email
HAVING COUNT(*) > 1;

Boş metin ile NULL aynı şey değildir. email = '' gibi boş metinler ayrıca bir değer olarak gruplanabilir. Veri temizliği yapmadan önce bu iki durumun tabloda nasıl tutulduğunu kontrol edin.

Her tekrar grubundan yalnızca bir kaydı seçme​


Tekrarları yalnızca görmek değil, hangi satırın korunacağını belirlemek istiyorsanız pencere işlevlerinden ROW_NUMBER() kullanılabilir. Aşağıdaki örnekte her e-posta grubundaki en küçük id korunacak aday olarak bırakılır:

SQL:
SELECT *
FROM (
    SELECT
        k.*,
        ROW_NUMBER() OVER (
            PARTITION BY email
            ORDER BY id
        ) AS sira
    FROM kullanicilar AS k
    WHERE email IS NOT NULL
) AS sirali
WHERE sira > 1;

PARTITION BY email, kayıtları e-posta adresine göre gruplar. ORDER BY id, her grup içindeki sıralamayı belirler. sira > 1 koşulu, her gruptaki ilk kayıt dışındaki satırları getirir.

Bu sorgu kayıtları silmez; yalnızca silinmeye aday satırları listeler. Hangi kaydın korunacağı iş kuralına göre değişebilir. Daha yeni kaydı korumak için ORDER BY id DESC veya güvenilir bir oluşturulma tarihi kullanılabilir. Kimlik değerinin zaman sırasını garanti etmediği sistemlerde yalnızca id üzerinden karar vermek doğru olmayabilir.

Sorgu sonuçlarını doğru yorumlama​


Tekrar sorgusunu çalıştırdıktan sonra şu ayrımları yapın:
  • Sonuçta bir satır varsa, seçtiğiniz sütun kombinasyonu en az iki kayıtta aynıdır.
  • Sonuçta hiç satır yoksa, o ölçüte göre tekrar bulunmamıştır; başka sütun kombinasyonları için aynı sonucu garanti etmez.
  • Tekrar sayısı yüksekse, veri aktarımı veya uygulama kodunun aynı işlemi birden fazla kez yazıp yazmadığını inceleyin.
  • Tekrarlar iş kuralına göre geçerliyse silme işlemi yapmayın; yalnızca benzersizlik kuralı gerçekten gerekiyorsa veritabanı kısıtlaması planlayın.
  • Tekrarlar hatalıysa önce hangi satırın korunacağını belirleyin, ardından yedek veya işlem geri alma planı olmadan toplu silme yapmayın.
Mevcut tekrarları bulmak gelecekte yeni tekrar oluşmasını kendiliğinden engellemez. Örneğin email benzersiz olmalıysa, önce mevcut çakışmaları temizleyip geçerli bir kaydı koruyun; daha sonra veritabanı sisteminizin desteklediği benzersiz kısıtlamayı veya benzersiz dizini eklemeyi değerlendirin. Böylece kontrol yalnızca sorguya değil, veri yapısına da taşınır.

Sık sorulan sorular​

Aynı değerden kaç tane bulunduğunu nasıl gösteririm?​

Tekrarlanan sütunu ve COUNT(*) ifadesini birlikte seçin. HAVING COUNT(*) > 1 koşulu tekrar etmeyen değerleri sonuçtan çıkarır; COUNT(*) ise her tekrar grubundaki kayıt sayısını verir.

Tekrar eden satırların ID değerlerini nasıl görürüm?​

Önce GROUP BY ve HAVING ile tekrar eden değerleri bulun, ardından bu sonucu asıl tabloyla JOIN edin. Alternatif olarak ROW_NUMBER() kullanarak her tekrar grubundaki kayıtları sıralayıp kimlikleriyle birlikte listeleyebilirsiniz.

Tablodaki bütün sütunlar aynıysa tekrar nasıl bulunur?​

Karşılaştırılacak tüm sütunları GROUP BY içine ekleyebilirsiniz. Ancak çoğu tabloda birincil anahtar gibi her satırda farklı olan bir sütun bulunur; bu sütunu karşılaştırmaya eklerseniz kayıtlar tekrar olarak gruplanmaz. Bu nedenle kimlik sütununu genellikle dışarıda bırakıp iş açısından anlamlı alanları kullanın.

Tekrarlanan kayıtları bulunca hemen silebilir miyim?​

Hayır. Sorgu yalnızca hangi kayıtların aynı ölçüte göre tekrar ettiğini gösterir; hangi kaydın korunması gerektiğini belirlemez. Önce sonuçları kimlik, tarih ve ilgili iş bilgileriyle inceleyin, korunacak satırı belirleyin ve silme işleminden önce yedekleme veya geri alma planı oluşturun.
 

Sende şimdi bize katılmak ister misin?

Kayıt ol

Bize katılım kolay ve ücretsizdir!

Foruma git ?

Bu konuyu görüntüleyen kullanıcılar

Bu konuyu şu anda görüntüleyen üye bulunmuyor.
Robotlar:
  • Anthropic