SQL Serverのテーブルから「重複行」を簡単に削除する方法

データベースをクリーンアップすることは、データの品質を維持するために重要です。特に重複行に関してはそうです。もし大きなSQL Serverのテーブル(たとえば、30万行以上)を扱っている場合、削除したい重複行に直面するかもしれません。このブログ記事では、関連するデータを保持しながら重複を効果的に排除するためのシンプルなプロセスを説明します。

問題の理解

MyTableというテーブルがあり、そこにアイデンティティフィールド(RowID)を持つ主キーが含まれている場合、重複は完全な一致として現れません。むしろ、Col1Col2Col3などの非キー列の1つ以上で異なるかもしれません。データの損失を避けるために、テーブルの整合性を確保しながらこれらの重複を賢く特定することが重要です。

MyTableの例構造

RowID int not null identity(1,1) primary key,
Col1 varchar(20) not null,
Col2 varchar(2048) not null,
Col3 tinyint not null

解決策の説明

関連する行を保持しながら重複行を効果的に削除するには、SQL ServerのGROUP BY文とDELETEコマンドを利用できます。以下は、明確にするためにステップを分けた説明です。

ステップバイステップガイド

1. 重複をチェックするための列でグルーピングとユニーク行の選択

最初のステップは、重複をチェックしたい列(この場合はCol1Col2Col3)によって行をグループ化することです。このグループごとの最小のRowIDを見つけるためにMIN関数を使用し、どの行を保持するかを指示します。

SQLコードは次のようになります。

SELECT MIN(RowId) as RowId, Col1, Col2, Col3 
FROM MyTable 
GROUP BY Col1, Col2, Col3

2. 重複の削除

保持する行を特定したら、次のステップは、新しく作成されたKeepRowsセットに対応するものを持たないすべてを削除することです。削除を実行するためのSQLコードは次のとおりです。

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

このコマンドは以下のことを行います。

  • MyTableと計算されたKeepRowsの間にLEFT OUTER JOINを行います。
  • KeepRowsRowIdが一致しないMyTableの行は削除されます。

ユニーク識別子の扱い

テーブルが行識別のために整数の代わりにGUIDを含む場合は、最小値の選択を調整するだけです。以下のように置き換えます。

MIN(RowId)

次のように変更します。

CONVERT(uniqueidentifier, MIN(CONVERT(char(36), MyGuidColumn)))

これにより、データ型の整合性を維持しながら、最小のGUIDを正しく特定することができます。

結論

SQL Serverから重複行を削除することは、GROUP BYとそれに関連する結合および削除技術を使用して効率的に実行できます。これらの手順に従うことで、重要なデータの損失を危険にさらすことなく、クリーンで機能的なデータベースを維持できます。大規模削除を行う前に、常にデータベースをバックアップすることを忘れないでください!

ここで得た知識を活用し、SQLテーブル内の重複の問題に自信を持って取り組みましょう。クエリを楽しんでください!