Удаление дублирующихся строк с помощью sql - PullRequest
0 голосов
/ 20 декабря 2011

Я пытаюсь удалить повторяющиеся строки из моей таблицы MySQL.Я пробовал несколько запросов, но продолжаю получать эту ошибку: # 1093 - Вы не можете указать целевую таблицу 'usa_city' для обновления в предложении FROM

Таблица выглядит следующим образом:

usa_city
--------
id(pk)
id_state
city_name

И я устал от вопросов:

DELETE FROM usa_city
WHERE id NOT IN
(
SELECT MIN(id)
FROM usa_city
GROUP BY city_name, id_state
)

И:

DELETE
FROM usa_city
WHERE usa_city.id IN

-- List 1 - all rows that have duplicates
(SELECT F.id
FROM usa_city AS F
WHERE Exists (SELECT city_name, id_state, Count(id)
FROM usa_city
WHERE usa_city.city_name = F.city_name
   AND usa_city.id_state = F.id_state
GROUP BY usa_city.city_name, usa_city.id_state
HAVING Count(usa_city.id) > 1))
AND usa_city.id NOT IN

-- List 2 - one row from each set of duplicate
(SELECT Min(id)
FROM usa_city AS F
WHERE Exists (SELECT city_name, id_state, Count(id)
FROM usa_city
WHERE usa_city.city_name = F.city_name
   AND usa_city.id_state = F.id_state
GROUP BY usa_city.city_name, usa_city.id_state
HAVING Count(usa_city.id) > 1)
GROUP BY city_name, id_state);

Заранее спасибо.

Ответы [ 5 ]

4 голосов
/ 20 декабря 2011

Попробуйте сначала выбрать дубликаты, удалить их

DELETE FROM usa_city WHERE city_id IN
(
SELECT city_id FROM usa_city
GROUP BY city_name, id_state
HAVING count(city_id) > 1
)

Надеюсь, это поможет !!!

ИЗМЕНЕНО: на основании комментария, , если вы хотите сохранить одинзаписав , вы можете сделать объединение и сохранить наименьшее значение

DELETE c1 FROM usa_city c1, usa_city c2 WHERE c1.id < c2.id AND 
(c1.city_name= c2.city_name AND c1.id_state = c2.id_state)

Обязательно сделайте резервную копию перед выполнением запроса выше ...

2 голосов
/ 20 декабря 2011

из документации mysql :

"В настоящее время вы не можете удалить из таблицы и выбрать из того же таблица в подзапросе. "

но здесь - это обходной путь для обновления, также должен работать для удаления.

Кроме того, вы можете выбрать строки, а затем в php, например, удалить их в цикле

0 голосов
/ 20 декабря 2011

Судя по вашим примерам, когда вы говорите «дубликат», вы имеете в виду «иметь одинаковую комбинацию id_state и city_name», верно?Если это так после того, как вы удалили дубликаты, я настоятельно рекомендую создать уникальное ограничение для {id_state, city_name}.

. Чтобы фактически удалить дубликаты, недостаточно просто идентифицировать набор дубликатов, вы также должны решить,какие из идентифицированных дубликатов до сохраняют .Предполагая, что вы хотите оставить те с наименьшим id, следующий фрагмент SQL выполнит эту работу:

CREATE TEMPORARY TABLE usa_city_to_delete AS
    SELECT id FROM usa_city T1
    WHERE EXISTS (
        SELECT * FROM usa_city T2
        WHERE
            T1.id_state = T2.id_state 
            AND T1.city_name = T2.city_name
            AND T1.id > T2.id
    );

DELETE FROM usa_city
WHERE id IN (SELECT id FROM usa_city_to_delete);

DROP TEMPORARY TABLE usa_city_to_delete;

К сожалению, MySQL не разрешает коррелированные подзапросы в DELETE, иначе мы могли бы сделатьчто в одном операторе, без временной таблицы.

--- EDIT ---

Вы не можете иметь коррелированный подзапрос, но вы можете иметь JOIN,как показано Карлос Кихано, ответ .Кроме того, временная таблица может быть создана неявно , как предлагает Kokers .

Так что можно сделать это в одном выражениивопреки тому, что я написал выше ...

0 голосов
/ 20 декабря 2011

Редактировать: Это решение также можно найти, если вы перейдете по ссылке, опубликованной BloodyWorld, поэтому, если оно работает, перейдите и отправьте сообщение DMin для голосования здесь

Нашел этот просмотр в интернете (# 1 результат Google для mysql удалить повторяющиеся строки), вы пробовали это?

delete from table1
USING table1, table1 as vtable
WHERE (NOT table1.ID=vtable.ID)
AND (table1.field_name=vtable.field_name)
0 голосов
/ 20 декабря 2011

Здесь вы можете найти ответ на свою проблему: Как удалить дубликаты записей в базе данных mysql?

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...