- Konu sahibi
- #1
İstenen sütunlarda aynı değerleri taşıyan kayıtları bulmak için
Varsayımsal olarak
Örneğin sonuçta
Tekrar ölçütü tek bir sütun değil, birkaç sütunun birlikte oluşturduğu değer olabilirse tüm bu sütunları
Burada yalnızca üç sütunun birlikte aynı olduğu gruplar bulunur. Aynı
İç sorgu, birden fazla kez geçen e-posta adreslerini bulur.
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
Eksik değerleri tekrar kontrolüne katmak istemiyorsanız koşulu gruplamadan önce ekleyin:
Boş metin ile
Tekrarları yalnızca görmek değil, hangi satırın korunacağını belirlemek istiyorsanız pencere işlevlerinden
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
Tekrar sorgusunu çalıştırdıktan sonra şu ayrımları yapın:
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.
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.