2016-05-19 1 views
1

У меня есть таблица «c31805», который выглядит следующим образом:Mysql Удаление дубликатов со следующими идентификаторами

| Id3| COL 1 |<br/> 
|----|--------|<br/> 
| 1 | trial1 |<br/> 
| 2 | x142 |<br/> 
| 3 | left |<br/> 
| 4 | left |<br/> 
| 5 | left |<br/> 
| 6 | trial2 |<br/> 
| 7 | x139 |<br/> 
| 8 | left |<br/> 
| 9 | left |<br/> 
| 10 | trial3 |<br/> 
|----|--------|<br/> 

Есть ли способ, чтобы удалить дубликаты в этом случае «влево», которые следуют друг за другом непосредственно. Но не те, которые последуют позже. Конечный результат должен выглядеть следующим образом:

| Id3| COL 1 |<br/> 
|----|--------|<br/> 
| 1 | trial1 |<br/> 
| 2 | x142 |<br/> 
| 3 | left |<br/> 
| 6 | trial2 |<br/> 
| 7 | x139 |<br/> 
| 8 | left |<br/> 
| 10 | trial3 |<br/> 
|----|--------|<br/> 

Я попробовал выбрать, чтобы отфильтровать дубликаты:

`SELECT `Id3` 
from c31805 a1 
where 0 < (select count(*) from c31805 a2 where a2.Id3 = a1.Id3 + 1 and a2.`COL 1` = a1.`COL 1`); 

Это похоже на работу.

Затем я попытался добавить удаления:

DELETE FROM c21705 
where id3 in (SELECT `Id3` from c21705 m1 where 0 < (select count(*) from c31805 m2 where m2.Id3 = m1.Id3 + 1 and m2.`COL 1` = m1.`COL 1`)); 

Но это вызывает сообщение об ошибке:

«# 1093 - Таблица 'c21705' указан дважды, как в качестве мишени для ' DELETE 'и в качестве отдельного источника данных "

Есть ли способ достижения этой цели.

ответ

1

Я думаю, что вы должны будете использовать псевдоним, чтобы избежать путаницы,

Ваш запрос будет выглядеть следующим образом.

DELETE `t` FROM c21705 as `t` where t.id3 in (SELECT Id3 from c21705 m1 where 0 < (select count(*) from c31805 m2 where m2.Id3 = m1.Id3 + 1 and m2.COL 1= m1.COL 1)); 
0

Запрос ниже будет держать повторяющиеся значения с наименьшим значением iD3

DELETE FROM c31805 
WHERE Id3 NOT IN (SELECT Id3 FROM t 
         (SELECT [COL 1], MIN(Id3) as Id3 
          FROM c31805 
          GROUP BY [COL 1] 
         ) t 
Смежные вопросы