Судя по вашим примерам, когда вы говорите «дубликат», вы имеете в виду «иметь одинаковую комбинацию 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 .
Так что можно сделать это в одном выражениивопреки тому, что я написал выше ...