Удалить дублированные строки из большой таблицы - PullRequest
2 голосов
/ 29 ноября 2011

У меня есть большая таблица (~ 1 000 000 строк), которая может содержать повторяющиеся значения.

таблица содержит два столбца (например, столбец a, столбец b), которые вместе представляют уникальный ключ, идентификатор и дату последнего обновления.

например, у меня может быть таблица как:

id | а | б | обновление

1 | Джон | Смит | 1/1

2 | Дон | Смит | 2/5

3 | боб | Дэвид | 1/1

4 | Дэн | Льюис | 3/1

5 | боб | Дэвид | 3/1

Как вы можете видеть для id 3 и 5, таблица содержит одинаковые значения в столбцах a и b. Я хотел бы удалить строки, содержащие этот тип дублирования, но сохранить последнюю обновленную строку.

Для этого примера у меня будет эта таблица после удаления: id | а | б | обновление

1 | Джон | Смит | 1/1

2 | Дон | Смит | 2/5

4 | Дэн | Льюис | 3/1

5 | боб | Дэвис | 3/1 * 1 029 *

(id = 3 удалено, поскольку у меня уже есть a = bob и b = davis в строке, где id = 5, а обновление в этой строке выше, чем в удаленной строке)

Ответы [ 3 ]

2 голосов
/ 29 ноября 2011
delete from MyTable
where exists (
    select 1 from MyTable t2
    where MyTable.a=t2.a and MyTable.b=t2.b and MyTable.upd<t2.upd
)
1 голос
/ 29 ноября 2011

Должно работать ниже.

DELETE FROM MYTABLE WHERE ID IN( SELECT M1.ID FROM MYTABLE M1, MYTABLE M2 WHERE M1.A = M2.A AND M1.B = M2.B AND M1.ID < M2.ID);

0 голосов
/ 29 ноября 2011

Вам нужно сделать две самостоятельные ссылки в предложении WHERE.Первая идентифицирует строки с дубликатами, а вторая гарантирует, что вы не удаляете самую последнюю версию.

DELETE
FROM     TestCase
WHERE    EXISTS (
   -- Where there's more than one
   SELECT   1
   FROM     TestCase AS Reference
   WHERE    TestCase.a = Reference.a
        AND TestCase.b = Reference.b
        AND TestCase.[update] <> Reference.[update]
   )
     AND TestCase.[update] <> (
   -- and this isn't the most recent
   SELECT   Max (Reference2.[update])
   FROM     TestCase AS Reference2
   WHERE    TestCase.a = Reference2.a
        AND TestCase.b = Reference2.b
   GROUP BY Reference2.a,
            Reference2.b
   )
...