Veritabanında birden fazla tekrar eden kayıtları sql ile tespit edebilmek aslında zor bir iş değil ancak eski veriler, yanlış oluşturulmuş veriler gibi senaryolar sebebi ile sıkça kullanmak zorunda kaldığım bir kalıbı paylaşmak istiyorum.
Örnek olarak PERSONEL_KIMLIK adında ve çeşitli türlerde personel kimlik bilgilerini tutabilen bir tablo üzerinde aynı PERSONEL_NO ve aynı KIMLIK_BILGI türüne sahip kayıtların olduğunu varsayalım. Yani yeni kimlik bilgisi girilirken, eski kaydın silinmediği bir durum olabilir. (Unique Index konmaması zaten ayıp :))
SELECT * FROM PERSONEL_KIMLIK p1
where exists (
select 1 from PERSONEL_KIMLIK p2
where p2.PERSONEL_NO=p1.PERSONEL_NO
and p2.KIMLIK_BILGI_TURU=p1.KIMLIK_BILGI_TURU
group by PERSONEL_NO,KIMLIK_BILGI_TURU
having p1.id<max(p2.id)
);
Eğer aşağıdaki gibi bir tablo verisine karşılık bu sorguyu çalıştırır isek kırmızı ve kalın olarak işaretlenmiş olan kayıtları dönecektir.
| ID | PERSONEL_NO | KIMLIK_BILGI_TURU | ….. |
| 1 | 111 | “SICILNO” | ….. |
| 2 | 111 | “SICILNO” | ….. |
| 3 | 111 | “SICILNO” | ….. |
| 4 | 112 | “SICILNO” | ….. |
| 5 | 112 | “SICILNO” | ….. |
| 6 | 113 | “TCKNO” | ….. |
| 7 | 113 | “TCKNO” | ….. |
Ben genelllikle bu sorgu sonucunda dönen kayıtlara direkt olarak DELETE query çalıştırırım, ya da iptal olarak işaretlemek için UPDATE ederim.
Bu sorgulara güncellemelere gerek kalmaması dileğiyle... :)