SQLで重複行を削除する方法 : SQL Server

投稿者: | 1月 3, 2015

巨大なテーブルから重複行を削除するにはどうしたらいいのでしょうか。
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のほうが実行プラン上では低コストになりやすいようです。

回答者が、ベストアンサーになってる方法よりも自分の回答のほうがすばらしい!アピールで記載しています。

image

コメントを残す

メールアドレスが公開されることはありません。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください