SQL: Doppelte Einträge anzeigen und löschen

edit | delete

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!