1

私のテーブルには重複したレコードがたくさんあります

SELECT ENROLMENT_NO_DATE,  COUNT(ENROLMENT_NO_DATE) AS NumOccurrences
FROM Import_Master GROUP BY ENROLMENT_NO_DATE HAVING ( COUNT(ENROLMENT_NO_DATE) > 1 )

2回目に発生した場合は、重複するレコードを削除する必要があります...最初または1つのレコードのいずれかを保持する必要があります。どうやってやるの?

4

2 に答える 2

4

CTEを使用して、次のタスクを実行できます。

;with cte as
(
  select ENROLMENT_NO_DATE, 
    row_number() over(partition by ENROLMENT_NO_DATE order by ENROLMENT_NO_DATE) rn
  from Import_Master
) 
delete from cte where rn > 1

デモ付きSQLFddleを参照してください

于 2012-08-21T11:55:15.570 に答える
1

1つの方法は、セカンダリの一時テーブルを作成することです。

CREATE TABLE Import_Master_Deduped AS SELECT * FROM Import_Master WHERE FALSE;

これにより、Import_Masterと同じ構造の空のテーブルが作成されます。次に、インデックスを使用して新しいテーブルに一意性を課します。

CREATE UNIQUE INDEX Import_Master_Ndx ON Import_Master_Deduped(ENROLMENT_NO_DATE);

最後に、INSERT IGNOREを使用して、重複レコードを含むテーブルをコピーし、重複レコードが挿入されないようにします。

INSERT IGNORE INTO Import_Master_Deduped SELECT * FROM Import_Master;

この時点で、すべてがOKであることを確認した後、名前を入れ替えて2つのテーブルの名前を変更するか(これにより古いインデックスが失われます)、Import_Masterテーブルを切り捨てて、重複排除されたレコードを新しいテーブルから古いテーブルにコピーして戻します。

2番目のケースでは、それ以上の重複を避けるために、古いテーブルにUNIQUE制約を再作成します。最初に、新しいテーブルに古いインデックスを再作成します。

最後に、不要になったテーブルを削除します。

于 2012-08-21T11:54:48.577 に答える