2016-04-26 2 views
1

私はこのようなテーブルを持っている場合:Reduntantデータのみを削除する方法はありますか?

ID  FROM_DATE   TO_DATE 
18177 2016-04-20 00:00 2016-04-20 00:00 
18177 2016-04-20 00:00 2016-04-20 00:00 
18177 2016-04-23 00:00 2016-04-23 00:00 
18177 2016-04-23 00:00 2016-04-23 00:00 
18177 2016-04-24 00:00 2016-04-24 00:00 
18177 2016-04-24 00:00 2016-04-24 00:00 
18177 2016-04-26 00:00 2016-04-26 00:00 
18177 2016-04-26 00:00 2016-04-26 00:00 
18177 2016-04-27 00:00 2016-04-27 00:00 
18177 2016-04-27 00:00 2016-04-27 00:00 
18177 2016-04-30 00:00 2016-04-30 00:00 
18177 2016-04-30 00:00 2016-04-30 00:00 

このテーブルには、何のキーを持っていない、と私は私の自己は、3列で構成される主キーを設定する必要が見つけましたが、ので、私はこれを行うことはできませんデータの複製。

冗長データの削除方法は?たとえば、同じデータを持つ2つのレコードがある場合、1つのレコードだけを保持したいのですか?

私はこのような結果は、問題を修正し、キーを設定したい:

ID  FROM_DATE   TO_DATE 
18177 2016-04-20 00:00 2016-04-20 00:00 
18177 2016-04-23 00:00 2016-04-23 00:00 
18177 2016-04-24 00:00 2016-04-24 00:00 
18177 2016-04-26 00:00 2016-04-26 00:00 
18177 2016-04-27 00:00 2016-04-27 00:00 
18177 2016-04-30 00:00 2016-04-30 00:00 
+3

コピーテーブルを作成し、copy into distinct from * from originaltableを挿入します。名前の変更 – jarlh

+0

@jarlh:質問を編集する –

+0

これを読んでください:http://stackoverflow.com/questions/18932/how-can-i-remove-duplicate-rows?rq=1 – StevieG

答えて

3

は、この仕事をしていますか?

delete from t 
    where rowid not in (select min(rowid) 
         from t 
         group by id, from_date, to_date 
         ); 

デフォルトでは、Informixテーブルには、rowidカラムが組み込まれています。このバージョンがうまくいけば、サブクエリを一時テーブルに入れて代わりに使うことができます。

にも注意してください:それは、多くの場合、より速く、このようにそれを行うには、次のとおりです。

select distinct id, from_date, to_date 
from t 
into temp temp_t; 

truncate table t; 

commit; -- If there was a transaction active 

insert into t(id, from_date, to_date) 
    select id, from_date, to_date 
    from temp_t; 

これは、大規模な削除であるため、ロギングとロックの考慮事項に高速になります。

+0

最初に好きなものを選んでみてくださいこの: 'ではないのROWID トンから選択*(ID、FROM_DATEによって グループ、TO_DATE トンから分(ROWID) を選択)、iはユニーク使用するときに' 私はあまり行を取得! 私は多くの列を持っていますbtw –

+0

@ anyname-donotcareこれらの他の列は各行ごとに異なる値を持っていますか?同じ 'id'、' from_date'と 'to_date'に対して他の列が行間で違う可能性はありますか?もしそうなら、あなたはどの行を保持するのですか? –

+0

@ anyname-donotcare投稿することができます:問題のテーブルの完全なスキーマ。 'SELECT COUNT(*)FROM t'の結果。 'SELECT COUNT(*)from t GROUP BY id、from_date、to_date'の結果。 'SELECT COUNT(*)FROM(SELECT UNIQUE * FROM t)'の結果です。 –

1
DELETE FROM Table_Name 
WHERE ROWID NOT IN (SELECT MAX(ROWID) FROM Table_Name 
        GROUP BY Id,From_Date,To_Date 
        ); 

最初に、内側のクエリを実行し、それはFROM_DATE & TO_DATE合わせ、IDに応じて異なるグループを作成します。この方法では、すべての重複レコードは同じグループにのみ属し、各グループの中で最大のROWIDのみを選択することによって別個のレコードをフィルタリングします。その後、外部クエリが実行され、重複したレコードが削除されます。

ROWIDは、データベースに挿入されるレコードごとに一意です。つまり、内部的にDBMS自体によって提供されます。

関連する問題