2

MySQLテーブルに数百のフィールドを持つ数千のレコードがあります。

一部のレコードは重複しており、そのようにマークされています。これで、重複を簡単に削除できますが、元のバージョンのレコードには存在しない、他の可能性のある貴重なnull以外のデータを保持したいと思います。私が理にかなっていることを願っています。

例えば ​​:

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

上記のサンプルテーブルから、必要な出力は次のとおりです。

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

よく見ると、重複はキーを使用して判断されます(2つのレコードでも同じであるため、重複フィールドに「x」が付いているものは、一部のフィールドを保持して削除するものです。複製(キー1のc、e値など)。

この不可解な問題についてさらに情報が必要な場合はお知らせください。

トンありがとう!

ps:MySQLを使用できない場合は、PERL/Pythonスクリプトサンプルが最適です。ありがとう!

4

4 に答える 4

2

私があなたを正しく理解していれば、1)2つのレコードをマージする2)マークされたレコードを削除する必要があります(簡単です)。

最初のタスクを実行するには、次のようなものを使用できます

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

PSこのクエリは、すべてのレコードに0または1つの重複があることを前提としています。さらにある場合は、クエリを変更する必要があります。

于 2010-04-09T18:22:08.480 に答える
1

コードを使用して、行をマージしてから、重複を削除できます。

SQLコード内に留まりたい場合は、テーブルのすべての列で保存されたプロシージャを実行する必要があります。このプロシージャは、ソース行がnullで、宛先行がnullでない場合にのみ更新されます。

ある種のカーソルを使用して、すべての重複ペアを反復処理します。

これは一般的なアイデアです。ここの誰かがより具体的なコードを手伝ってくれることを願っています...

于 2010-04-09T18:17:47.413 に答える
0

答えはあなたが実際に何をしたいかに非常に依存します。インプレース編集の重複レコードが必要ですか、それとも目的の結果を持つ一時テーブルを作成する必要がありますか。インプレース編集レコードが必要な場合は、Pythonを使用して、a1ex07sayのようないくつかの連続したクエリを実行してから単純な'delete from ... where dupe='x''を実行する方がよいと思います。一時テーブルを使用できる場合は、1つの(それほどではない)単純なmysql'INSERT INTO ... SELECT'を使用して、重複レコードをIFNULLまたはCAOLESCEとマージし、実際の無視レコードをdupe='x'とマージできます。

于 2010-04-09T18:36:29.477 に答える
0
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]

このスレッドのメッサによる回答...

于 2010-04-12T17:32:06.547 に答える