2009-03-23 5 views
7

중복 된 전화 번호를 삭제하기 위해 다음 쿼리를 클라이언트에 제공했습니다. MSSQL 데이터베이스에 레코드를 저장하지만 이제는 MySQL에서도 수행해야하며 MySQL이 쿼리 형식에 대해 불평한다고보고합니다. 내 코드 샘플에 대해 중복 된 테스트 테이블 설정을 포함 시켰지만 실제 삭제 쿼리는 중요합니다.MySQL 테이블에서 중복을 삭제하는 방법

나는 MySQL을 다운로드하고 설치하는 데 여전히 바쁘다. 그리고 누군가가 뜻있는 시간에 도움을 줄 수 있기 때문에 나는 이것을 무지하고 긴급히 묻는다.

create table bkPhone 
(
    phoneNo nvarchar(20), 
    firstName nvarchar(20), 
    lastName nvarchar(20) 
) 
GO 

insert bkPhone values('0783313780','Brady','Kelly') 
insert bkPhone values('0845319792','Mark','Smith') 
insert bkPhone values('0834976958','Bill','Jones') 
insert bkPhone values('0845319792','Mark','Smith') 
insert bkPhone values('0828329792','Mickey','Mouse') 
insert bkPhone values('0834976958','Bill','Jones') 

alter table bkPhone add phoneId int identity 

delete from bkPhone 
where phoneId not in 
(
    select min(phoneId) 
    from bkPhone 
    group by phoneNo,firstName,lastName 
    having count(*) >= 1 
) 
+1

나에게 잘 보입니다. 서브 쿼리를 지원하는 MySQL 버전을 사용하고 있습니까? –

+0

왜'카운트 (*)> = 1' ?? 절대 그렇지 않을 때? – RichardTheKiwi

답변

14

많은 방법으로 로마로 통한다. 이것은 하나입니다. 그것은 매우 빠릅니다. 따라서 큰 데이터베이스와 함께 사용할 수 있습니다. indeces 잊지 마세요. 속임수는 : phoneNo를 유일하게 만들고 "무시"를 사용하십시오.

drop table if exists bkPhone_template; 
create table bkPhone_template (
     phoneNo varchar(20), 
     firstName varchar(20), 
     lastName varchar(20) 
); 

insert into bkPhone_template values('0783313780','Brady','Kelly'); 
insert into bkPhone_template values('0845319792','Mark','Smith'); 
insert into bkPhone_template values('0834976958','Bill','Jones'); 
insert into bkPhone_template values('0845319792','Mark','Smith'); 
insert into bkPhone_template values('0828329792','Mickey','Mouse'); 
insert into bkPhone_template values('0834976958','Bill','Jones'); 

drop table if exists bkPhone; 
create table bkPhone like bkPhone_template; 
alter table bkPhone add unique (phoneNo); 

insert ignore into bkPhone (phoneNo,firstName,lastName) select phoneNo,firstName,lastName from bkPhone_template; 

drop table bkPhone_template; 

데이터 테이블이 이미있는 경우에는 다음 insert insert select select와 함께 create table select 만 실행하면됩니다. 결국 테이블 이름 바꾸기 문을 실행해야합니다. 그게 다야.

이 해결 방법은 삭제 작업보다 훨씬 빠르고 빠릅니다.

+0

MySQL에 대한 두 부분 교육에 감사드립니다. 나는 이제 테이블 만들기를 '좋아한다'고 생각하고 내 무기고에서는 '무시'합니다. – ProfK

+2

참고 중복 된 링크로 인해 답변을 한 후 오랫동안 주석을 달아주세요.) 'ALTER IGNORE TABLE ADD UNIQUE (phoneNo)'를 사용하면 다른 테이블을 만들 필요없이 자동으로 테이블의 복사본을 삭제합니다. – Wrikken

5

당신은에 의해 독특한 사람을 선택할 수 있습니다

select distinct(phoneNo) from bkPhone 

다른 테이블에 넣어, 이전 테이블을 삭제하고 이름을 변경 새로운 이름으로 옛 이름.

+0

시나리오의 단순성을 고려하면 새 테이블과 삭제 된 테이블을 허용하는 것이 가장 간단합니다. 가장 효과적인 해결책. 감사. – ProfK

2

MySQL은 불만을 토로합니다. 그룹화 할 min() 열을 사용하여 집계하려고했습니다. 당신 같은 사람에 대한 중복 전화 번호를 삭제하려는 경우 지금

,의 SQL은 다음과 같아야합니다

delete from bkPhone 
where phoneId not in 
(
     select min(phoneId) 
     from bkPhone 
     group by firstName,lastName /* i.e. grouping by person and NOT grouping by phoneId */ 
     having count(*) >= 1 
) 
+0

굉장합니다. 그 사랑스러운'having' 절의 또 다른 유스 케이스 :-)하지만'> = '대신에'>'를 써야한다고 생각합니다. 그게 물건을 가속 수도 있습니다 –

+0

나는이 '데'의 요점을 전혀 볼 수 없습니다. 그것이 그대로, 항상 사실이어야합니다, 그래서 그것은 무의미합니다. 그리고 그것을> 1로 변경하면, * 중복이없는 rows *는 내부의'select'에서 생략되어 바깥 쪽'delete'에 의해 제거됩니다. 네가 원하는 것이 아니라, 나는 믿는다. – MvG

+0

@LukasEder :'> '를 사용하면 하나의 전화 만있는 모든 항목이 삭제됩니다. 나는 당신이 조건에 'not'이 있다는 것을 눈치 채지 않았다고 생각합니다. – vartec

관련 문제