巨大なテーブルから重複行を削除するにはどうしたらいいのでしょうか。
stackoverflowの「How can I remove duplicate rows?」で解答がついていますので紹介します。
前提となるテーブルは次の定義となっています。
ポイントは、完全に重複しているわけではない点。理由は、identity定義を使って主キーは自動インクリメントされているから。
MyTable ----------- RowID int not null identity(1,1) primary key, Col1 varchar(20) not null, Col2 varchar(2048) not null, Col3 tinyint not null
方法1
DELETE MyTable
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
intではなく、GUIDを使っている場合は、MIN(RowID)の代わりに次のクエリを使います。
CONVERT(uniqueidentifier, MIN(CONVERT(char(36), MyGuidColumn)))
方法2
;WITH cte AS (SELECT ROW_NUMBER() OVER (PARTITION BY Col1, Col2, Col3 ORDER BY ( SELECT 0)) RN FROM #MyTable) DELETE FROM cte WHERE RN > 1
ちなみに、方法2のほうが実行プラン上では低コストになりやすいようです。
回答者が、ベストアンサーになってる方法よりも自分の回答のほうがすばらしい!アピールで記載しています。