Как удалить Дубликаты в таблице MySQL - PullRequest
7 голосов
/ 23 марта 2009

Я дал клиенту следующий запрос на удаление дубликата телефона. Записи в базе данных MSSQL, но теперь они должны также делать это на 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
 )

Ответы [ 4 ]

14 голосов
/ 29 марта 2009

Многие пути ведут в Рим. Это один Это очень быстро. Таким образом, вы можете использовать его с большими базами данных. Не забывайте об индейцах. Хитрость в том, чтобы сделать телефон не уникальным и использовать «игнорировать».

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;

Если таблица данных уже существует, то вам нужно только запустить создание таблицы select с последующей вставкой игнорировать select. В конце вы должны выполнить несколько операторов переименования таблиц. Вот и все.

Этот обходной путь намного, намного быстрее, чем операция удаления.

5 голосов
/ 23 марта 2009

Вы можете выбрать уникальные из:

select distinct(phoneNo) from bkPhone

и поместите их в другую таблицу, удалите старую таблицу и переименуйте новую в старое имя.

2 голосов
/ 23 марта 2009

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
 )
1 голос
/ 23 марта 2009
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...