Neuigkeiten:

Ist euer Problem gelöst, dann bitte den Knopf "Thema gelöst" drücken!

Mobiles Hauptmenü

Identifizieren von Dubletten, Ergänzen von Infos + Löschen der Dublette(n)

Begonnen von Anke_71, Februar 01, 2021, 02:42:54

⏪ vorheriges - nächstes ⏩

Anke_71

Hallo, ich bräuchte Unterstützung bei der Behandlung von Dubletten in meiner Datenbank.
Table: Contacts
ContactID   Name   Str   PLZ   Tel   Fax   email   
1   aaa   Weg 1   11111         @1   Bleibt erhalten
2   aaa   Weg 1   11111   123      @2   Wird gelöscht
3   aaa   Weg 1   11111   888   abc   @3   Wird gelöscht
                     
                     

Ich möchte 2 (oder mehr) Dubletten über Kriterien in MEHREREN Spalten identifizieren, leere Information in einer Spalte mit Infos aus dem anderen Feld auffüllen, und dann anschliessend die Dubletten mit den höheren IDs löschen und nur einen eindeutigen Datensatz behalten.

Meine Löschabfrage sieht derzeit so aus (Dubletten über Name+Str+PLZ):

DELETE *
FROM Contacts AS C1
WHERE ContactID <>
(SELECT MIN(ContactID)
FROM Contacts AS C2
WHERE C2.Name = C1.Name
AND C2.Str = C1.Str
AND C2.PLZ = C1.PLZ);

Ich würde jetzt gerne bei den identifizierten Doppelten VOR dem Löschen prüfen, ob Tel UND/ODER Fax feld oder email feld in dem contactID MIN verbleibenden Datensatz leer sind, und in den zu löschenden aber gefüllt, und dann die Telefonnummer aus ID2 in das leere Feld von ID1 übernehmen usw.. Es soll nichts überschrieben werden, sondern nur leere Felder befüllt werden.
Es ist auch etwas tricky, wenn unterschiedliche Inhalte da sind, das wäre aber nicht kritisch, irgendein Inhalt wäre ok. 
Wunschergebnis nach dem Löschen:
ContactID   Name   Str   PLZ   Tel   Fax   email
1   aaa   Weg 1   11111   123   abc   @1

Hat jemand eine Idee? Ein Weg mit zwei separaten Queries (erst Aktualisierung und dann Löschung) wäre natürlich auch möglich.
Wenn ich drei oder mehr Dubletten habe, könnte ich möglicherweise auch zwei Aktualisierungs-Queries nacheinander laufen lassen und pro Durchlauf immer zwei Dubletten behandeln?

Ich bin für jeden Tip oder Ansatz dankbar!

ebs17

Der allererste Hinweis wäre, in einer Stammdatentabelle der DB einen eindeutigen (zusammengesetzten) Index zu setzen und somit ein Anlegen von ungewünschten Duplikaten von Haus aus auszuschließen.

Somit dürften wir in Folge nur von einem einmaligen Aufräumen des bestehenden Datenbestandes reden bzw. dann evtl. auch von Datenübernahmen aus laufenden Importen.

Danach würde ich mich vor Schreiben einer Anweisung um die nötige Logik bemühen.
- Warum willst Du den Datensatz mit der niedersten ID behalten, der doch zeitlich am Unaktuellsten sein dürfte?
- Bei mehreren Datensätzen mit Inhalten, also potentiell unterschiedlichen Inhalten: Welchen Inhalt würde man wirklich übernehmen wollen? Also warum bei Telefon 123 und nicht 888?
- Auch bei richtiger Auswahl ist eine Löschung ein Informationsverlust. Das kann im Nachgang ärgerlich sein.

Idee - vielleicht für die Anwendung etwas überzogen, aber technisch deutlich einfacher:
Tel, Fax, email  werden in eine eigene Tabelle Kommunikation ausgelagert mit einem Fremdschlüssel auf den Kontakt. Konsequent dann als jeweilige einzelne Datensätze. Über ein Zeitstempelfeld könnte man die Aktualität dokumentieren und sich später bei einer Anzeige oder Datenverarbeitung auf die jeweils aktuellsten Informationen beziehen. Parallel könnte man jeweils eine Information als Standard markieren, um sich in Folge immer auf diesen begrenzen zu können. Eine Änderung des Standards könnte über ein GUI auch ein User selber vornehmen.
Hiermit dürfte es auch sehr viel einfacher sein, veraltete und wirklich nicht mehr benötigte Informationen dann auch zu entfernen.
Mit freundlichem Glück Auf!

Eberhard

Anke_71

Hallo Eberhard,
danke für die Ausführungen, leider kein Lösungsansatz.

Ich habe eine Tabelle mit ca. 1.000.000 Datensätzen vorliegen, die ich einmal in der beschriebenen Weise "aufräumen" muss, falls ich es nicht manuell von Hand für jeden Datensatz einzeln machen möchte.

Gibt es vielleicht jemanden, der einen Ansatz hätte?

Vielen Dank
Anke

ebs17

Ansatz? Ich glaube, ich hatte einen genannt.

Konkrete Anweisungen (<> Ansatz, ganze Hand statt kleiner Finger) wie auch schon Gedanken darüber machen nur hinsichtlich belastbarer Logik (Fragen dazu hatte ich genannt) und vorhandener zu fixierender Strukturen Sinn.

Wenn ich mir Fragen selber beantworte, könnte das vielleicht in anderer Weise erfolgen als sich einer/eine denken mag. In jedem Fall würde ich einen Aufwand nur einmal treiben wollen, also besser auf Basis von Durchdachtheit und Klarheit.
Mit freundlichem Glück Auf!

Eberhard