2013-07-31 3 views
0

Мне нужно удалить около 300 000 дубликатов в моей базе данных. Я хочу проверить столбец Card_id на наличие дубликатов, а затем проверить наличие повторяющихся временных меток. Затем удалите одну копию и сохраните ее. Пример:Проверка SQL дубликатов в одном столбце и удаление другого

| Card_id | Time |  
| 1234 | 5:30 |  
| 1234 | 5:45 |  
| 1234 | 5:30 |  
| 1234 | 5:45 | 

Так остальные данные будут:

| Card_id | Time |  
| 1234 | 5:30 |  
| 1234 | 5:45 | 

Я попробовал несколько различных ВЕЬЕТЕ, и слияние в новую таблицу, но не повезло.

ОБНОВЛЕНИЕ: Сработало!

Хорошо после многих сбоев я получил это для работы в DB2.

delete from(
select card_id, time, row_number() over (partition by card_id, time) rn 
from card_table) as A 
where rn > 1 

rn приращения при наличии дубликатов для card_id и времени. Дублированный или второй rn будет удален.

+1

У вас есть 'id' столбец для идентификации записей однозначно? –

+0

У этой информации нет уникального идентификатора. – Nexus

+0

Мы имеем дело с ** дубликатами ** или можем ли вы иметь три (или более) строки с одинаковыми? –

ответ

2

я настоятельно рекомендую вам принять этот подход:

create temporary table tokeep as 
    select distinct card_id, time 
    from t; 

truncate table t; 

insert into t(card_id, time) 
    select * 
    from tokeep; 

То есть, хранить данные, которые вы хотите. Усекайте таблицу, а затем восстановите ее. Усекая таблицу, вы можете сохранить триггеры и разрешения и другие вещи, связанные с таблицей.

Этот подход также должен быть быстрее, чем удаление многих и многих дубликатов.

Если вы собираетесь сделать это, вы должны вставить правильный идентификатор, а также:

create temporary table tokeep as 
    select distinct card_id, time 
    from t; 

truncate table t; 

alter table t add column id int auto_increment; 

insert into t(card_id, time) 
    select * 
    from tokeep; 
+0

+1 Вот как это сделать. –

+0

Будет ли это работать, если у меня будет больше столбцов? – Nexus

+0

@Nexus. , , Это будет работать для любого количества столбцов. –

0

Если у вас нет Primary key или Candidate key, вероятно, нет никакой возможности, используя только одну команду. Попробуйте решение ниже.

Создать таблицу с дубликатами

select Card_id,Time 
    into COPY_YourTable 
    from YourTable 
    group by Card_id,Time 
    having count(1)>1 

Удалить дубликаты с помощью COPY_YourTable

delete from YourTable 
    where exists 
    (
    select 1 
    from COPY_YourTable c 
    where c.Card_id = YourTable.Card_id 
    and c.Time = YourTable.Time 
    ) 

Копирование данных без дубликатов

insert into YourTable 
    select Card_id,Time 
    from COPY_YourTabl 
Смежные вопросы