SQL : élimination des doublons d’une table
La requête SQL ci-dessous a pour objet l’élimination des doublons constatés dans le champ content_hash de la table ttrss_entries, en privilégiant la conservation des premières lignes ajoutées.
Ici, le moteur de base de données utilisé est MariaDB. Il dispose depuis la version 10.3 de l’opérateur EXCEPT, comme dans SQL Server et PostgreSQL. Pour Oracle, il s’agit de MINUS.
Si vous avez mieux et moins compliqué, je suis preneur !
1er jet : une requête peu optimisée
DELETE FROM ttrss_entries WHERE id IN ( -- Sélection de tous les id des enregistrements en double sur le champ content_hash SELECT id FROM ttrss_entries WHERE content_hash IN ( SELECT content_hash FROM ttrss_entries GROUP BY content_hash HAVING COUNT(content_hash)>1 ) -- Sélection de laquelle on retire les lignes étant ajoutées en 1er EXCEPT SELECT MIN(id) FROM ttrss_entries GROUP BY content_hash HAVING COUNT(content_hash)>1 );
2e jet : une requête optimisée
START TRANSACTION; DELETE FROM ttrss_entries WHERE id IN ( WITH req_titles AS ( SELECT id, MD5(title) md5title FROM ttrss_entries ), req_doublons AS ( SELECT md5title,MIN(ID) minid FROM req_titles GROUP BY md5title HAVING COUNT(md5title)>1 ) SELECT id FROM req_titles WHERE md5title IN ( SELECT md5title FROM req_doublons ) EXCEPT SELECT minid FROM req_doublons ); COMMIT;