#mysql
Вопрос:
Я хочу сделать запрос, который удаляет дубликаты данных, оставляя только один дубликат данных, когда два столбца перекрываются. Возможно, из-за большого количества данных, но следующий запрос долгое время не работает
DELETE t1 FROM table t1 INNER JOIN table t2
WHERE t1.idx < t2.idx AND t1.Nm = t2.Nm AND t1.product = t2.product;
Может ли этот запрос делать то, что я хочу? Если нет, то каков другой путь?
Комментарии:
1. Вы должны соединять только строки, которые одинаковы, УДАЛИТЕ t1 ИЗ таблицы t1 ВО ВНУТРЕННЕЙ таблице СОЕДИНЕНИЯ t2 (t1.Nm = t2.Nm И t1.product = t2.product) ГДЕ t1.idx;
2. Я попробовал сделать так, как вы мне сказали, но он работает уже более 5 минут. Строка составляет около 30000 строк, но так ли это долго?
Ответ №1:
Создайте индекс для 3 столбцов, участвующих в предложении ON:
CREATE INDEX idx_name
ON tablename (Nm, product, idx);
и выполните запрос следующим образом:
DELETE t1 FROM tablename t1 INNER JOIN tablename t2
WHERE t1.Nm = t2.Nm AND t1.product = t2.product AND t1.idx < t2.idx;
Как вы можете видеть в этой упрощенной демонстрации, запрос будет выполнен с использованием индекса.