2010-04-09 4 views
2

MySQL 테이블에서 거의 100 개의 필드가있는 수천 개의 레코드가 있습니다.복제 항목에 데이터가 있지만 원래 항목에는없는 필드를 유지하여 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 

은 (그것이 두 레코드에 대해 동일하므로, 중복 레코드 필드에 'x'가있는 레코드는 중복 레코드의 일부 필드를 유지함으로써 삭제되는 레코드입니다 (예 : 키 1의 c, e 값).

나 이 수수께끼 같은 문제에 대한 자세한 정보가 필요한지 확인하십시오.

감사합니다.

p.s : MySQL을 사용할 수없는 경우 PERL/Python 스크립트 샘플이 멋집니다! 감사!

+0

주어진 키 값에 대해 하나 이상의 중복 레코드가있을 수 있습니까? – BenV

+0

나는 열쇠가 실제로 "열쇠"가 아닐 것이라고 생각한다. (아마 serogate 열쇠가있을 것이다.) – Dani

+0

두 개 이상의 중복은 허용되지 않습니다. 그들은 두 쌍으로 존재합니다. 키는 속임수를 구별하기위한 것입니다. – ThinkCode

답변

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] 

= 'x'를 잘 속는 사람과 IFNULL 또는 CAOLESCE 실제 igonoring 기록에 속는 기록을 병합 의해 답변을 Messa this 스레드 ...

1

코드를 사용하면 줄을 병합 한 다음 속임수를 삭제할 수 있습니다.

내부에 있으려면 테이블의 모든 열에서 저장 프로 시저를 실행해야합니다.이 행은 null이 아니고 대상 행이 null이 아닌 경우에만 소스 행을 업데이트합니다.

어떤 종류의 커서를 사용하여 모든 사기 쌍을 반복합니다.

이, 내가 제대로 이해하면

+0

병합은 계획처럼 들립니다. 파이썬이 그것을 할 수도 있지만 파이썬에서 초보자이며 파이썬 합병을 내 문제에 적용하는 방법을 잘 모르겠습니다. 빠른 회신 주셔서 감사합니다 :) – ThinkCode

2

, 당신은 (표시된 레코드를 삭제)이 개 기록 2를 병합 1)가 필요합니다 ... 여기 사람이 더 구체적인 코드와 함께 당신을 도울 수있는 일반적인 아이디어 희망한다 그것은 간단하다).

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.처럼 사용하는 뭔가를 할 수있는 첫 번째 작업을 수행하려면 이 쿼리는 모든 레코드에 0 또는 1 개의 중복이 있다고 가정합니다. 더 많은 정보가 있으면 쿼리를 수정해야합니다.

+0

문제는 몇 백 열이 있습니다. 나는 그들 모두에 대한 비효율적 인 업데이트 성명을 피하려고 노력하고있다. 더 나은 솔루션이 존재하기를 바랍니다. 고맙습니다. – ThinkCode

0

답변은 실제로 당신이하고 싶은 것에 달려 있습니다. 중복 레코드를 내부 편집하거나 원하는 결과가있는 임시 테이블을 만들고 싶습니다. 내부 편집 기록을 원한다면, 파이썬을 사용하여 a1ex07과 같은 순차적 쿼리를 수행하고 'delete from ... where dupe ='x ''와 같은 간단한 쿼리를 수행하는 것이 더 좋습니다. 임시 테이블을 사용할 수 있다면, 당신이 사용할 수있는 하나의 (안 아주) 간단한 MySQL은, 'SELECT ... INTO INSERT'

+0

임시 테이블은 문제가되지 않습니다. 유일한 문제는 100 개의 열을 모두 수동으로 업데이트하고 싶지 않다는 것입니다. – ThinkCode

+0

좋아, 임시 문제가없는 경우 다음과 같은 것을 사용할 수 있습니다 'tempTable (x) select into coalesce (x1, (sourceTable s2에서 x2 선택 s2.keu = s1.key where s2.dupe = x ') from sourceTable s1 여기서 s1.dupe <>'x ' 제한이 없으면 2-3 개의 쿼리로 간단한 파이썬 스크립트를 작성하는 것이 좋습니다 –

+0

파이썬 스크립트는 대단히 유용합니다 필드가 null인지 확인하여 속기 및 비 중복 속임수 목록을 통과하는 Python 스크립트를 만들려고합니다. 제발 도와주세요 :) – ThinkCode