SQL Serverのテーブルから「重複行」を簡単に削除する方法
データベースをクリーンアップすることは、データの品質を維持するために重要です。特に重複行に関してはそうです。もし大きなSQL Serverのテーブル(たとえば、30万行以上)を扱っている場合、削除したい重複行に直面するかもしれません。このブログ記事では、関連するデータを保持しながら重複を効果的に排除するためのシンプルなプロセスを説明します。
問題の理解
MyTable
というテーブルがあり、そこにアイデンティティフィールド(RowID
)を持つ主キーが含まれている場合、重複は完全な一致として現れません。むしろ、Col1
、Col2
、Col3
などの非キー列の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. 重複をチェックするための列でグルーピングとユニーク行の選択
最初のステップは、重複をチェックしたい列(この場合はCol1
、Col2
、Col3
)によって行をグループ化することです。このグループごとの最小の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
を行います。KeepRows
にRowId
が一致しないMyTable
の行は削除されます。
ユニーク識別子の扱い
テーブルが行識別のために整数の代わりにGUID
を含む場合は、最小値の選択を調整するだけです。以下のように置き換えます。
MIN(RowId)
次のように変更します。
CONVERT(uniqueidentifier, MIN(CONVERT(char(36), MyGuidColumn)))
これにより、データ型の整合性を維持しながら、最小のGUID
を正しく特定することができます。
結論
SQL Serverから重複行を削除することは、GROUP BY
とそれに関連する結合および削除技術を使用して効率的に実行できます。これらの手順に従うことで、重要なデータの損失を危険にさらすことなく、クリーンで機能的なデータベースを維持できます。大規模削除を行う前に、常にデータベースをバックアップすることを忘れないでください!
ここで得た知識を活用し、SQLテーブル内の重複の問題に自信を持って取り組みましょう。クエリを楽しんでください!