SQL: Doppelte Einträge anzeigen und löschen
Autor: Ralf v.d.Mark
eingetragen: Freitag, 31. März 2017 um 11:02 Uhr (13/2017 Kalenderwoche)
geändert: Freitag, 11. März 2022 um 09:43 Uhr (10/2022 Kalenderwoche)
Keywords: doppelte mehrfach gruppieren using having invalid
Kategorien: DB: MySQL, DB: PostgreSQL, DB: Oracle, DB: MariaDB,
Text:
Doppelte IDs in der Datenbank finden.
Die Abfrage im Quellcode kann folgende Ausgabe erzeugen:
id | anzahl | Doppel_Ids
73008 | 2 | 2721,1906
73009 | 2 | 2723,2224
73010 | 2 | 2724,2246
73011 | 2 | 2736,2597
73012 | 2 | 2738,2598
und mit einer einfachen Query löschen (s. Bsp. 2)
siehe auch: "Doppelte Zuganskennungen finden/löschen"
Quellcode:
-- Prüfen, ob es in der Tabelle keine Doppelten gibt
SELECT `foprojekt_id`,
GROUP_CONCAT(`id`) AS Doppel_Ids,
COUNT(`foprojekt_id`) AS anzahl
FROM `abstimmung_log`
WHERE `abgestimmt_ts` IS NULL
GROUP BY `foprojekt_id`
HAVING anzahl > 1 -- So kommen nur die 9 Doppelten
ORDER BY anzahl DESC;
-- 904 Datensätze, davon 9 mehr als 1x vorhanden!
-- Nun einfach die Doppelten löschen und die mit der größten/neusten ID behalten:
DELETE FROM abstimmung_log
USING abstimmung_log, abstimmung_log as Dup
WHERE NOT abstimmung_log.id = Dup.id
AND abstimmung_log.id < Dup.id
AND abstimmung_log.foprojekt_id = Dup.foprojekt_id;
-- Meldet, das 63 Datensätze gelöscht wurden, es sind
-- aber in Wahrheit nur die erwarteten 9 tatsächlich gelöscht worden.
-- Bei PostgreSQL hat folgendes funktioniert:
SELECT COUNT(user_email), user_email
FROM "public"."lu_user"
GROUP BY user_email
HAVING (COUNT(user_email) > 1)
Anhänge: Das Verzeichnis ist leer!