T-SQL 重複行削除方法のコード例解説
T-SQLで重複行を削除する方法
T-SQL (Transact-SQL) を使用して、テーブル内の重複行を削除しながら、各重複セットから1つの行を保持する方法について説明します。
一時テーブルの作成
まず、元のテーブルの構造を複製した一時テーブルを作成します。これは、削除する行を一時的に格納するために使用されます。
CREATE TABLE #TempTable (
-- ここに元のテーブルの列を定義
);
重複行の特定
次に、元のテーブルから重複行を特定します。通常、重複行は、特定の列の値が同じである場合に識別されます。
INSERT INTO #TempTable
SELECT DISTINCT
-- すべての列を指定
FROM
YourTableName
WHERE
ROW_NUMBER() OVER (PARTITION BY -- 重複を定義する列 ORDER BY -- 任意の列) = 1;
ROW_NUMBER()
関数は、各パーティション内で行に連続番号を割り当てます。PARTITION BY
句は、重複を定義する列を指定します。ORDER BY
句は、同じパーティション内の行をソートし、最初の行を保持します。
元のテーブルの更新
最後に、元のテーブルを一時テーブルの内容で更新します。これにより、重複行が削除され、各重複セットから1つの行が保持されます。
DELETE FROM YourTableName
WHERE
YourTableName.PrimaryKey NOT IN (SELECT PrimaryKey FROM #TempTable);
DELETE
ステートメントは、元のテーブルから指定された条件に一致する行を削除します。NOT IN
演算子は、元のテーブルのプライマリキーが一時テーブルのプライマリキーに含まれていない行を削除します。
例
CREATE TABLE #Customers (
CustomerID INT PRIMARY KEY,
FirstName NVARCHAR(50),
LastName NVARCHAR(50)
);
INSERT INTO #Customers VALUE S
(1, 'John', 'Doe'),
(2, 'Jane', 'Smith'),
(3, 'John', 'Doe'),
(4, 'Jane', 'Smith');
-- 重複行を削除
DELETE FROM #Customers
WHERE
CustomerID NOT IN (SELECT CustomerID FROM #TempTable);
DROP TABLE #TempTable;
この例では、#Customers
テーブルに重複する顧客データが含まれていると仮定します。上記のコードを実行すると、重複する行が削除され、各顧客名に対して1つの行が保持されます。
注意:
- 重複を定義する列を適切に選択してください。
ROW_NUMBER()
関数を使用する場合は、ソート順が重要です。- 大量のデータを処理する場合は、パフォーマンスに注意してください。
T-SQL 重複行削除方法のコード例解説
コード例 1: 一時テーブルを使用
CREATE TABLE #TempTable (
-- ここに元のテーブルの列を定義
);
INSERT INTO #TempTable
SELECT DISTINCT
-- すべての列を指定
FROM
YourTableName
WHERE
ROW_NUMBER() OVER (PARTITION BY -- 重複を定義する列 ORDER BY -- 任意の列) = 1;
DELETE FROM YourTableName
WHERE
YourTableName.PrimaryKey NOT IN (SELECT PrimaryKey FROM #TempTable);
DROP TABLE #TempTable;
解説:
- 一時テーブルの作成:
#TempTable
という名前の一時テーブルを作成します。これは、削除する行を一時的に格納するために使用されます。 - 重複行の特定:
INSERT INTO #TempTable
ステートメントを使用して、元のテーブルYourTableName
から重複行を特定し、一時テーブルに挿入します。 - 元のテーブルの更新:
DELETE FROM YourTableName
ステートメントを使用して、元のテーブルから重複行を削除します。 - 一時テーブルの削除:
DROP TABLE #TempTable
ステートメントを使用して、一時テーブルを削除します。
コード例 2: CTE (Common Table Expression) を使用
WITH CTE AS (
SELECT
*,
ROW_NUMBER() OVER (PARTITION BY -- 重複を定義する列 ORDER BY -- 任意の列) AS RowNum
FROM
YourTableName
)
DELETE FROM CTE
WHERE
RowNum > 1;
- CTE の定義:
CTE
という名前の CTE を定義します。 - 重複行の削除:
DELETE FROM CTE
ステートメントを使用して、CTE 内の重複行を削除します。WHERE RowNum > 1
は、各パーティション内の2番目以降の行を削除します。
DELETE JOIN
DELETE T1
FROM
YourTableName T1
INNER JOIN
YourTableName T2
ON
T1.PrimaryKey = T2.PrimaryKey
AND T1.RowNumber > T2.RowNumber;
DELETE JOIN
を使用して、重複する行を削除します。
OUTPUT INTO
DECLARE @DeletedRows TABLE (
-- 削除された行の列を定義
);
DELETE FROM YourTableName
OUTPUT
DELETED.*
INTO
@DeletedRows
WHERE
ROW_NUMBER() OVER (PARTITION BY -- 重複を定義する列 ORDER BY -- 任意の列) > 1;
OUTPUT INTO
句を使用して、削除された行を一時テーブルに格納します。- 削除された行を後処理するために使用できます。
WHILE LOOP
WHILE EXISTS (
SELECT 1
FROM
YourTableName
GROUP BY
-- 重複を定義する列
HAVING
COUNT(*) > 1
)
BEGIN
DELETE FROM YourTableName
WHERE
ROW_NUMBER() OVER (PARTITION BY -- 重複を定義する列 ORDER BY -- 任意の列) > 1;
END;
WHILE
ループを使用して、重複行が存在する限り、繰り返し削除します。
CURSOR
DECLARE @PrimaryKey INT;
DECLARE CursorToDeleteDuplicates CURSOR FOR
SELECT
PrimaryKey
FROM
YourTableName
GROUP BY
-- 重複を定義する列
HAVING
COUNT(*) > 1;
OPEN CursorToDeleteDuplicates;
FETCH NEXT FROM CursorToDeleteDuplicates INTO @PrimaryKey;
WHILE @@FETCH_STATUS = 0
BEGIN
DELETE FROM YourTableName
WHERE
PrimaryKey = @PrimaryKey
AND ROW_NUMBER() OVER (PARTITION BY -- 重複を定義する列 ORDER BY -- 任意の列) > 1;
FETCH NEXT FROM CursorToDeleteDuplicates INTO @PrimaryKey;
END;
CLOSE CursorToDeleteDuplicates;
DEALLOCATE CURSOR CursorToDeleteDuplicates;
- カーソルを使用して、重複行を逐次処理し、削除します。
これらの手法は、状況に応じて選択することができます。
- DELETE JOIN は、シンプルで効率的です。
- OUTPUT INTO は、削除された行を後処理する必要がある場合に便利です。
- WHILE LOOP は、複雑な条件に基づいて重複行を削除する場合に使用できます。
- CURSOR は、特定の処理が必要な場合に使用できますが、パフォーマンスが低下する可能性があります。
sql sql-server t-sql