Вопрос

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

 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 должна четко идентифицировать дубликаты.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top