Удаление повторяющихся строк из таблицы
-
20-08-2019 - |
Вопрос
В моей базе данных есть таблица с повторяющимися записями, которые я хочу удалить.Я не хочу создавать для этого новую таблицу с отдельными записями.Я хочу удалить повторяющиеся записи из существующей таблицы без создания новой таблицы.Есть какой-либо способ сделать это?
id action
L1_name L1_data
L2_name L2_data
L3_name L3_data
L4_name L4_data
L5_name L5_data
L6_name L6_data
L7_name L7_data
L8_name L8_data
L9_name L9_data
L10_name L10_data
L11_name L11_data
L12_name L12_data
L13_name L13_data
L14_name L14_data
L15_name L15_data
смотрите, это все мои поля:
id уникален для каждой строки.
L11_data уникальны для соответствующего поля действия.
L11_data содержит названия компаний, а действие — названия отраслей.
Итак, в моих данных есть повторяющиеся названия компаний в L11_data для соответствующих отраслей.
Я хочу, чтобы уникальное имя и другие данные о компаниях в конкретной отрасли хранились в действии.Надеюсь, я изложил свою проблему так, чтобы вы могли ее понять.
Решение
Да, если у вас есть поле уникального идентификатора, вы можете удалить все записи, которые одинаковы, за исключением идентификатора, но не имеют «минимального идентификатора» для своей группы значений.
Пример запроса:
DELETE FROM Table
WHERE ID NOT IN
(
SELECT MIN(ID)
FROM Table
GROUP BY Field1, Field2, Field3, ...
)
Примечания:
- Я свободно выбрал «Таблица» и «ID» в качестве репрезентативных имен.
- Список полей («Поле1, Поле2, ...») должен включать все поля, кроме идентификатора.
- Это может быть медленный запрос в зависимости от количества полей и строк, однако я ожидаю, что это будет нормально по сравнению с альтернативами.
РЕДАКТИРОВАТЬ:Если у вас нет уникального индекса, я рекомендую просто добавить автоинкрементный уникальный индекс.Главным образом потому, что это хороший дизайн, а также потому, что он позволит вам выполнить приведенный выше запрос.
Другие советы
ALTER IGNORE TABLE 'table' ADD UNIQUE INDEX(your cols);
Дубликаты получают значение NULL, затем вы можете удалить их
DELETE
FROM table_x a
WHERE rowid < ANY (
SELECT rowid
FROM table_x b
WHERE a.someField = b.someField
AND a.someOtherField = b.someOtherField
)
WHERE (
a.someField,
a.someOtherField
) IN (
SELECT c.someField,
c.someOtherField
FROM table_x c
GROUP BY c.someField,
c.someOtherField
HAVING count(*) > 1
)
В приведенном выше запросе комбинация someField и someOtherField должна четко идентифицировать дубликаты. Р>