2012-05-10 11 views
3

可能性の重複:私たちは、ほとんどの(すべてではない)の行を意味する事故によって2回、それに挿入された同じデータを持っていたテーブルを持っている
Oracle Delete Rows Matching On Multiple ValuesOracleデータベースから重複行を削除する方法は?

テーブルに二回表示されます。簡単に言えば、私は、SQLステートメントは、行の1つのバージョンを削除し、他のバージョンを削除したいと思います。私はそれらが同一であるので削除されるバージョンは気にしない。

表構造のようなものです:

FID、UNIQUE_ID、COL3、COL4 ....

Unique_IDは、それぞれが一度だけ表示されます意味、主キーです。 FIDは各機能に固有のキーなので、複数表示される場合は重複を削除する必要があります。重複を持っている機能を選択する

は次のようになります。

select count(*) from TABLE GROUP by FID

残念ながら、私は一つだけ、それぞれのを残して余分な行を削除するSQL DELETEステートメントにそれから行く方法を見つけ出すことはできません。

このような質問が以前からありましたが、私は別のテーブルを作成しようとしましたが、名前を付けずにすべての列を取得する方法はありますか?これは、単一の列FIDを取得し、維持するためにすべての列をitemisingすることはできます:ORA-00936: missing expression

CREATE TABLE secondtable NOLOGGING as select distinct FID from TABLE

+0

ソリューションを入手した後、重複レコード(いわゆる冗長性)が正規化されていないデータベースの結果である可能性が高いため、データベースを正規化することをお勧めします。 – Kushal

+0

@Kush - 多くの異なるアプリケーションで使用されているため、データベースを正規化することはできません。これは、2007年にデータを2回読み込んだ結果ですが、これをあまり使用しないため、以前は気付かなかったのです。しかし、提案に感謝 –

答えて

6

あなたが保持されている行気にしない場合は

DELETE FROM your_table_name a 
WHERE EXISTS(SELECT 1 
       FROM your_table_name b 
       WHERE a.fid = b.fid 
        AND a.unique_id < b.unique_id) 

これが完了したら、FIDが一意であることを保証する制約をテーブルに追加することになります。

1

提案

DELETE FROM x WHERE ROWID IN 
(WITH y AS (SELECT xCOL, MIN(ROWID) FROM x GROUP BY xCOL HAVING COUNT(xCOL) > 1) 
SELCT a.ROWID FROM x, y WHERE x.XCOL=y.XCOL and x.ROWIDy.ROWID) 
3

この

DELETE FROM table_name A WHERE ROWID > (
SELECT min(rowid) FROM table_name B 
WHERE A.FID = B.FID) 
+0

理論ではこれはジャスティン・ケイブと同じですが、私の 'rowid'が整数であるにもかかわらず、データ型エラーを出してしまったため、あなたがうまくいきませんでした。 –

0

を試してみてはこれを試してみてください。

DELETE FROM firsttable WHERE unique_ID NOT IN 
(SELECT MAX(unique_ID) FROM firsttable GROUP BY FID) 

EDIT: 一つの説明:

SELECT MAX(unique_ID) FROM firsttable GROUP BY FID; 

このSQLステートメントは、各重複行グループからそれぞれ最大UNIQUE_ID行を選択します。 deleteステートメントは、これらの最大unique_ID行を保持し、各重複グループの他の行を削​​除します。

0

これを試すことができます。

+0

あなたのコードが何をしているかについての簡単な説明を含めることは良い礼儀であると考えられます。 – Neil

関連する問題