2011-08-23 68 views
2

我有一個從CSV文件的copy創建的臨時表,結果包括一些重複的ID。我需要刪除任何重複。我試過以下內容:刪除重複的記錄,保留一個

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); 

但是,這會刪除重複的記錄,我必須保留一個。

如何刪除帶有重複ID的第2條記錄?

謝謝。

+0

這個臨時表只是一個列嗎? DISTINCT將保留他們當然.... –

+0

對不起,不,它是5列。 – pstanton

回答

2

您的查詢將刪除計數大於1的所有ID,因此它會刪除所有重複的內容。你需要做的是從副本列表中隔離一個記錄和保存認爲:

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); 

編輯修正:P

+0

min(id)... group by id? –

+0

@Irit:點了!固定:)我的例子是多列數據;如果只有一個列(ID),那麼OP應該在ID列上放置一個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";