SQL : élimination des doublons d’une table

SQL : élimination des doublons d'une tableLa 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;

SQL  / SQL