2011-10-26 4 views
1

이전 DBA는 2.4M 항목이있는 비 관계형 테이블을 관리하며 모두 고유 ID를 사용합니다. 그러나, 예를 들어, 각 레코드에 서로 다른 데이터와 중복 된 기록이 있습니다MySQL 다중 중복 레코드 병합

+---------+---------+--------------+----------------------+-------------+ 
| id  | Name | Address  | Phone | Email  | LastVisited | 
+---------+---------+--------------+---------+------------+-------------+ 
| 1  | bob  | 12 Some Road | 02456 |   |    | 
| 2  | bobby |    | 02456 | [email protected] |    | 
| 3  | bob  | 12 Some Rd | 02456 |   | 2010-07-13 | 
| 4  | sir bob |    | 02456 |   |    | 
| 5  | bob  | 12SomeRoad | 02456 |   |    | 
| 6  | mr bob |    | 02456 |   |    | 
| 7  | robert |    | 02456 |   |    | 
+---------+---------+--------------+---------+------------+-------------+ 

이 정확한 테이블 밤은 - 이것은 단지 나는를 식별하는 방법을 알고

을 설명하는 것입니다 - 실제 테이블은 32 열이 중복,이 경우에는 전화 번호를 사용하고 있습니다. 나는 사본을 별도의 테이블에 추출했습니다. 전체적으로 730,000 개의 엔트리가 있습니다.

이러한 레코드를 병합하는 가장 효율적인 방법은 무엇이며 삭제가 필요없는 레코드에 플래그를 지정하면 어떻게됩니까?

INNER JOIN의 UPDATE를 사용하여 보았습니다.하지만 후속 레코드의 데이터로 첫 번째 레코드를 업데이트하려는 경우 WHERE 절이 필요합니다. 이전 레코드에는 추가 레코드가없는 추가 데이터가 있습니다.

나는 그런 Fuzzy Dups 같은 타사 소프트웨어 검토 한 결과,하지만 수는

최종 목표는 다음 내가 좋아하는 뭔가 남아있을 거라고 경우 나는 순수 MySQL의 옵션을 싶습니다

+---------+---------+--------------+----------------------+-------------+ 
| id  | Name | Address  | Phone | Email  | LastVisited | 
+---------+---------+--------------+---------+------------+-------------+ 
| 1  | bob  | 12 Some Road | 02456 | [email protected] | 2010-07-13 | 
+---------+---------+--------------+---------+------------+-------------+ 

스토어드 프로 시저/함수에서 루핑을해야합니까? 아니면 내가 놓친 실제적인 것이 있습니까?

+0

U는 프로 시저를 작성해야합니다 ...하지만 내가 원하는 u가 원하는 것이 무엇인지 더 알고 싶습니다. 유선 전화에 따라 그룹화하고 싶지만 그 그룹에 다른 이름이나 주소 등이 있으면 어떤 값을 사용합니까? –

+0

안정적인 지점이 있어야 할 것 같습니다. 첫 번째 레코드가 올바른 레코드 여야한다고 말하면됩니다. 이것은 모든 기록에 대한 경우는 아니지만 위험을 기꺼이 감수합니다! – Rucia

답변

1

는 U는 프로 시저를 작성해야하지만 같은 그 전에 UR 자신의 temp_table를 만들 : U는 U가에 커서를 실행할 수 있도록 위에서 언급 한 물리적 테이블을 만들 필요가

Insert into temp_table(column1, column2,....) values (select column1, column2... from myTable GROUP BY phoneNumber) 

.

시저의 MYPROC를 생성 {

create a cursor on temp:: 
fetch the phoneNumber and id of the current row from the temp_table to the local variable(L_id, L_phoneNum). 

그리고 여기에서도 유

Insert into similar_tempTable(column1, column2,....) values (Select column1, column2,.... from myTable where phoneNumber=L_phoneNumber) 

다음 단계는 각 칼럼의 값을 추출하는 것 같은 값을 포함하는 새로운 similar_tempTable을 만들어야 similar_tempTable에서 원하는 및 id = L_id myTable 행에 업데이트 및 myTable에서 나머지 중복 행을 삭제하십시오.

그리고 한 가지 더, 커서의 모든 반복 후 similar_tempTable을 절단 ...이 유 도움이 될 것입니다

희망 ...

+0

그래서 내가 올바르게 이해하면 나는 임시 테이블 위에 커서를 놓고 다른 임시 테이블을 생성한다. 그것이 그렇다면 비행 중에 테이블을 만드는 속도가 느려지는 것입니까? 아니면 – Rucia

+0

U는 그 완벽 함을 오해하고 있습니다. 그다지 느리지는 않습니다. 전화 번호에 색인을 붙이고, 이것을 고려해보십시오, 이것은 한 번 실행되는 proc입니다.그래서 단 한 번 걱정해야합니다 –

+0

한 번만 걱정하면됩니다. 도와 줘서 고마워. :) – Rucia