2

我在 MySQL 表中有几千条记录,只有 100 个字段。

一些记录是重复的,并被标记为这样。现在,虽然我可以简单地删除欺骗,但我想保留原始记录版本中不存在的任何其他可能有价值的非空数据。希望我说得通。

例如 :

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 代码中,则需要在表的每一列上运行存储过程,仅当源行为空且目标行不为空时才更新源行。

使用某种游标迭代所有欺骗对。

这是一个一般的想法,我希望这里有人可以帮助您提供更具体的代码......

于 2010-04-09T18:17:47.413 回答
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]

Messa 在线程中的回答...

于 2010-04-12T17:32:06.547 回答
0

答案很大程度上取决于你真正想要做什么。您是要就地编辑重复记录,还是要创建具有所需结果的临时表。如果你想要就地编辑记录,我认为你最好使用 python 来执行几个顺序查询,比如 a1ex07 说,然后简单的“从...中删除”,其中 dupe = 'x''。如果你可以使用临时表,你可以使用一个(不是很)简单的 mysql 'INSERT INTO ... SELECT',用 IFNULL 或 CAOLESCE 合并重复记录,用 dupe = 'x' 合并实际忽略记录

于 2010-04-09T18:36:29.477 回答