次の例では、T-SQLを使用してSQLServerの重複行を削除します。
具体的には、重複する行を削除しますが、1つは保持します。したがって、同じ行が2つある場合は、一方を削除してもう一方を保持します。つまり、テーブルの重複を排除します。
サンプルデータ
次のデータを含むテーブルがあるとします。
SELECT * FROM Pets;
結果:
+---------+-----------+-----------+ | PetId | PetName | PetType | |---------+-----------+-----------| | 1 | Wag | Dog | | 1 | Wag | Dog | | 2 | Scratch | Cat | | 3 | Tweet | Bird | | 4 | Bark | Dog | | 4 | Bark | Dog | | 4 | Bark | Dog | +---------+-----------+-----------+
最初の2行は重複しており、最後の3行も重複していることがわかります。
重複を選択
テーブルの重複排除を行う前に、次のクエリを使用して、削除される行を確認できます。
WITH CTE AS
(
SELECT
*,
ROW_NUMBER() OVER (
PARTITION BY PetId, PetName, PetType
ORDER BY PetId, PetName, PetType
) AS Row_Number
FROM Pets
)
SELECT * FROM CTE WHERE Row_Number <> 1;
結果:
+---------+-----------+-----------+--------------+ | PetId | PetName | PetType | Row_Number | |---------+-----------+-----------+--------------| | 1 | Wag | Dog | 2 | | 4 | Bark | Dog | 2 | | 4 | Bark | Dog | 3 | +---------+-----------+-----------+--------------+
重複を削除
重複する値を削除するには、SELECT *
を置き換えることで上記のクエリを変更できます DELETE
の最後の行 :
WITH CTE AS
(
SELECT
*,
ROW_NUMBER() OVER (
PARTITION BY PetId, PetName, PetType
ORDER BY PetId, PetName, PetType
) AS Row_Number
FROM Pets
)
DELETE FROM CTE WHERE Row_Number <> 1;
結果:
(3 rows affected)
これで、テーブルの重複が解除されました。
これは、すべての行を再度選択することで確認できます:
SELECT * FROM Pets;
結果:
+---------+-----------+-----------+ | PetId | PetName | PetType | |---------+-----------+-----------| | 1 | Wag | Dog | | 2 | Scratch | Cat | | 3 | Tweet | Bird | | 4 | Bark | Dog | +---------+-----------+-----------+
予想どおり、犬の「Wag」の重複行の1つが削除され、もう1つは残っています。 「Bark」の重複行のうち2つも削除されました。テーブルは正常に重複排除されました。