Удаление повторяющихся строк из таблицы - PullRequest
4 голосов
/ 25 июня 2009

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

 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

посмотри, это все мои поля:
Идентификатор уникален для каждой строки.
L11_data уникальна для соответствующего поля действия.
У L11_data есть названия компаний, в то время как у действий есть названия отраслей.

Так что в моих данных у меня есть дублирующие названия компаний в L11_data для их соответствующих отраслей.

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

Ответы [ 3 ]

12 голосов
/ 25 июня 2009

Да, если у вас есть уникальное поле идентификатора, вы можете удалить все записи, которые являются одинаковыми, за исключением идентификатора, но не имеют «минимального идентификатора» для их группы значений.

Пример запроса:

DELETE FROM Table
WHERE ID NOT IN
(
SELECT MIN(ID)
FROM Table
GROUP BY Field1, Field2, Field3, ...
)

Примечания:

  • Я свободно выбрал «Таблица» и «ID» в качестве репрезентативных имен
  • Список полей («Поле1, Поле2, ...») должен включать все поля, кроме идентификатора
  • Это может быть медленный запрос в зависимости от количества полей и строк, однако я ожидаю, что это будет хорошо по сравнению с альтернативами

РЕДАКТИРОВАТЬ: Если у вас нет уникального индекса, я рекомендую просто добавить автоинкрементный уникальный индекс. Главным образом потому, что это хороший дизайн, но также потому, что он позволит вам выполнить запрос выше.

4 голосов
/ 25 июня 2009
ALTER IGNORE TABLE 'table' ADD UNIQUE INDEX(your cols);

Дубликаты получают значение NULL, затем вы можете удалить их

0 голосов
/ 25 июня 2009
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 должна четко идентифицировать дубликаты.

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