かなり大きな`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)))
Microsoftのサポートサイトに、重複の除去に関する良い記事があります。かなり保守的で、すべてを別々の手順で行うようになっていますが、大きなテーブルに対してはうまく機能するはずです。
私は過去に自己結合を使ってこれを行ったことがありますが、おそらくHAVING句を使ってきれいにすることができるでしょう。
DELETE dupes
FROM MyTable dupes, MyTable fullTable
WHERE dupes.dupField = fullTable.dupField
AND dupes.secondDupField = fullTable.secondDupField
AND dupes.uniqueField > fullTable.uniqueField