2014-10-27 2 views
0

Я борюсь с тем, что, как я думал, будет простым. Мне нужно удалить несколько повторяющихся строк, которые были созданы в таблице после выпуска некоторого багги-кода.mysql удалить из таблицы на основе выбора из таблицы

Запрос Я попытался это следующим образом:

delete from buzz where id IN (select distinct b1.id from buzz b1, buzz b2 where b1.id != b2.id and b1.message = b2.message); 

Выбрать, безусловно, выбирает правильные идентификаторы, которые я хочу удалить, но я получаю ошибку

ERROR 1093 (HY000): Вы не может указывать целевую таблицу «buzz» для обновления в разделе FROM.

Я пробовал все разные вещи, о которых я могу думать, поэтому теперь я думаю, что я просто приближаюсь к этому неправильно.

Может кто-нибудь помочь?

ответ

0

Вы действительно не нужно подзапрос для этого. Это должно работать:

DELETE b1 
FROM buzz b1, 
    buzz b2 
WHERE b1.id > b2.id 
    AND b1.message = b2.message; 

Это удаляет дубликаты, но оставляет оригинал в таблице.

+0

Все эти решения были отличными, но это было идеально для наших нужд, поскольку было полезно оставить оригинал на месте. – mark

+0

Хотя, я должен добавить, что вам нужно использовать «отдельный b1» или вы получите много дубликатов идентификаторов. – mark

0

Существует небольшая уловка для решения проблемы в MySQL. Он работает на MySQL 5.6 в списке, просто обернуть суб-выбора с другой один суб-выбора:

delete from buzz where id IN (select * from 
(select distinct b1.id from buzz b1, buzz b2 where b1.id != b2.id 
and b1.message = b2.message) Tab_alias); 

Также вы можете обратиться к This.

0

Попробуйте это:

delete from buzz where id IN (
    select id from (
     select distinct b1.id 
     from buzz b1, buzz b2 
     where b1.id != b2.id 
     and b1.message = b2.message) 
    as tempTable); 
Смежные вопросы