Wie doppelte Datensätze in MySQL zu löschen, indem Sie die Felder mit Daten im doppelten Elemente beibehalten, aber nicht in dem ursprünglichen Artikel?

StackOverflow https://stackoverflow.com/questions/2609734

Frage

Ich habe einige Tausende von Datensätzen mit einigen 100 Felder in einer MySQL-Tabelle.

Einige Aufzeichnungen sind Duplikate und sind als solche gekennzeichnet. Jetzt, während ich einfach die Betrogenen löschen können, möchte ich andere mögliche wertvolle Nicht-Null-Daten behalten, die in der ursprünglichen Version des Datensatzes nicht vorhanden ist. Hoffe, dass ich einen Sinn.

Zum Beispiel:

a b c d e f key dupe
--------------------
1 d c f k l 1   x
2 g   h   j 1    
3 i   h u u 2
4 u r     t 2   x

Aus der obigen Beispieltabelle, die gewünschte Ausgabe ist:

a b c d e f key dupe
--------------------
2 g c h k j 1
3 i r h u u 2

Wenn Sie es genau betrachtet, wird das Duplikat mit der Taste bestimmt (es ist das gleiche für zwei Datensätze, so derjenige, der eine hat ‚x‘ für Dupé Feld ist die eine durch die Beibehaltung einiger der gelöscht werden von der Betrogene Felder (wie c, e Werte für Taste 1).

Bitte lassen Sie mich wissen, wenn Sie weitere Informationen über dieses rätselhafte Problem benötigen.

Dank Tonne!

P. S: Wenn es nicht möglich, den Einsatz von MySQL ist, wäre ein PERL / Python-Skriptbeispiel genial! Dank!

War es hilfreich?

Lösung 4

import string, os, sys
import csv
import MySQLdb
import pickle
from EncryptedFile import EncryptedFile

enc = EncryptedFile( os.getenv("HOME") + '/.py-encrypted-file')
user = enc.getValue("user")
pw = enc.getValue("pw")

db = MySQLdb.connect(host="127.0.0.1", user=user, passwd=pw,db=user)

cursor = db.cursor()
cursor2 = db.cursor()

cursor.execute("select * from delThisTable")
rows = cursor.fetchall()
data = dict()
for row in rows:
    key, primary = row[0], row[1]
    if key not in data:
        data[key] = list(row[:-1])
    else:
        for i in range(len(row)-1):
            if data[key][i] is None or (not primary and row[i] is not None):
                data[key][i] = row[i]

Antwort von Messa in this Thread ...

Andere Tipps

Wenn ich Sie richtig verstanden, was Sie brauchen  1) fusionieren 2 Datensätze  2) Löschen markierte Datensätze (es ist einfach).

Um die erste Aufgabe erfüllen Sie nutzen so etwas wie tun kann,

UPDATE table1 t1 
INNER JOIN table1 t2 ON (t1.key = t2.key AND t2.dupe='x')
SET t1.b= IFNULL(t1.b,t2.b), t1.c=IFNULL(t1.c,t2.c), ...etc
WHERE t1.dupe IS NULL

P. S. Diese Abfrage wird davon ausgegangen, dass jeder Datensatz hat 0 oder 1 doppelt; wenn Sie mehr haben, um die Abfrage Bedarf geändert werden.

Code verwenden können Sie die Linien verschmelzen und dann die Betrogene löschen.

Wenn Sie in SQL-Code bleiben wollen Sie benötigen eine gespeicherte procedue auf jeder Spalte der Tabelle laufen dass Update Zeile der Quelle nur dann, wenn es der Null und die Zielzeile nicht null ist.

Iterieren über alle Betrogenen Paare eine Art von Cursor.

Dies ist eine allgemeine Idee, ich hoffe hier jemand Ihnen mit spezifischeren Code helfen kann ...

Die Antwort hängt sehr auf das, was Sie wirklich wollen, zu tun. Haben Sie Inplace bearbeiten doppelte Datensätze möchten, oder Sie wollen mit dem gewünschten Ergebnis temporäre Tabelle erstellen. Wenn Sie Inplace bearbeiten Aufzeichnungen wollen, ich bin denken Sie besser zu nutzen Python mehrere sequental auszuführen queryes ein wie a1ex07 sagen und dann einfach ‚löschen aus ... wo Betrogene =‚x‘‘. Wenn Sie temporäre Tabelle verwenden können, können Sie eine (nicht sehr) einfach mysql ‚INSERT INTO ... SELECT‘, Verschmelzung Betrogene Datensätze mit IFNULL oder CAOLESCE und tatsächlichem igonoring Datensätze mit Betrogene = ‚x‘

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top