重複する行を削除するにはどうしたらいいですか?

かなり大きな`SQL Server**テーブル(例:300,000行以上)から重複する行を削除するには、どのような方法がありますか?

もちろん、RowIDという識別フィールドが存在するので、行は完全な重複ではありません。

マイテーブル

RowID int not null identity(1,1) primary key,
Col1 varchar(20) not null,
Col2 varchar(2048) not null,
Col3 tinyint not null
ソリューション

ヌル文字がないと仮定して、ユニークなカラムで GROUP BY して、MIN (or MAX) の RowId を保持する行として SELECT します。その後、行IDを持たないものをすべて削除します。

DELETE FROM MyTable
LEFT OUTER JOIN (
   SELECT MIN(RowId) as RowId, Col1, Col2, Col3 
   FROM MyTable 
   GROUP BY Col1, Col2, Col3
) as KeepRows ON
   MyTable.RowId = KeepRows.RowId
WHERE
   KeepRows.RowId IS NULL

整数ではなくGUIDの場合には

MIN(RowId)

CONVERT(uniqueidentifier, MIN(CONVERT(char(36), MyGuidColumn)))
解説 (30)

Microsoftのサポートサイトに、重複の除去に関する良い記事があります。かなり保守的で、すべてを別々の手順で行うようになっていますが、大きなテーブルに対してはうまく機能するはずです。

私は過去に自己結合を使ってこれを行ったことがありますが、おそらくHAVING句を使ってきれいにすることができるでしょう。

DELETE dupes
FROM MyTable dupes, MyTable fullTable
WHERE dupes.dupField = fullTable.dupField 
AND dupes.secondDupField = fullTable.secondDupField 
AND dupes.uniqueField > fullTable.uniqueField
解説 (0)

ここにも重複の除去に関する良い記事があります。

SQLは関係代数に基づいており、関係代数では重複は発生しません、なぜなら重複はセットでは許されないからです。"

tempテーブルによる解決策と、2つのmysqlの例を紹介しています。

将来的には、データベースレベルで防止するのか、アプリケーションの観点から防止するのか。 なぜなら、データベースは参照整合性の維持に責任を持つべきであり、開発者はただ問題を起こすだけだからです。)

解説 (1)