2011-08-23 5 views
2

У меня есть временная таблица, созданная из файла copy из файла CSV, и результат включает в себя некоторые дубликаты идентификаторов. Мне нужно удалить любое дублирование. Я пробовал следующее:удалить дубликаты записей, сохранить один

delete from my_table where id in 
    (select id from (select count(*) as count, id 
     from my_table group by id) as counts where count>1); 

Однако это удаляет как дубликаты записей, так и я должен их хранить.

Как удалить только вторую запись с дублированным идентификатором?

Спасибо.

+0

Является ли эта таблица темпов только одним столбцом? DISTINCT сохранит их, конечно .... –

+0

извините, нет 5 столбцов. – pstanton

ответ

2

В вашем запросе удаляются все идентификаторы с числом больше 1, поэтому он удаляет все, что дублируется. Что вам нужно сделать, это выделить одну запись из списка дубликатов и сохранить это:

delete 
from my_table 
where id in  (select id 
        from  my_table 
        where some_field in (select some_field 
              from  my_table 
              group by some_field 
              having count(id) > 1)) 
and id not in (select min(id) 
        from  my_table 
        where some_field in (select some_field 
              from  my_table 
              group by some_field 
              having count(id) > 1) 
        group by some_field); 

EDIT Исправлено: P

+0

мин (id) ... группа по id? –

+0

@Irit: Точка взята! Исправлено: мой пример для многоколоночных данных; если есть только один столбец (ID), тогда OP должен поставить ограничение PK в столбец идентификатора и снова запустить импорт! – Xophmeister

+0

Dammit: Сделал еще одну ошибку ... ОК: теперь исправлено, и это работает :) – Xophmeister

1

Предполагая, что у вас нет внешнего ключа отношения ...

CREATE TABLE "temp"(*column definitions*); 

insert into "temp" (*column definitions*) 
select *column definitions* 
from (
     select *,row_number() over(PARTITION BY id) as rn from "yourtable" 
) tm 
where rn=1; 

drop table "yourtable"; 

alter table "temp" rename to "yourtable"; 
Смежные вопросы