2016-05-18 11 views
1

テーブルに10を超える列が含まれています。例えばプライマリキー以外のすべての値が同じであるSQL Serverから重複レコードを削除します

id name date  status rec_id ..... etc 
------------------------------------------------------- 
1 ssss 01/01/2000 Active 3  ..... 
2 ssss 01/01/2000 Active 3  ..... 
3 aaaa 11/01/2002 Active 5  ..... 
4 aaaa 11/01/2002 Active 5  ..... 

私は、この表に重複したレコードを削除したいと私は

 1  ssss 01/01/2000 Active 3  ..... 
    3  aaaa 11/01/2002 Active 5  ..... 

以下のような結果がどのように我々はこれを達成しますしたいですか?

それが削除された

delete from test 
where ID not in (select min(ID) 
       from test 
       group by name); 

以下のように私はIDに基づいて重複したレコードを削除することができます。しかし、私は上記の方法が正しいことを確認したいですか?

+1

他の列に同じ名前の行が異なる値を持つことができますか?そうでない場合 - クエリは正常です –

答えて

1

はい、あなたのクエリは正しい軌道に乗っているが、あなたは、重複を定義するすべての列だけではなく、nameを含める必要があります。

DELETE FROM test 
WHERE ID NOT IN 
(SELECT MIN(ID) FROM TEST 
GROUP BY name, date, rec_id, status , {etc}) 
1

使用列リストの使用について 下に示すように、CTEを使用することができます一意のレコードを持つすべての列。 CTEの列のリストにID列を含めないでください

WITH DuplicateCTE 
    AS 
    (
    SELECT column1,column2,..,lastcolumn 
    ROW_NUMBER() OVER 
    (PARTITION BY column1,column2,..,lastcolumn ORDER BY column1) AS DuplicateCount 
    FROM yourtablename 
    ) 
    DELETE FROM DuplicateCTE WHERE DuplicateCount > 1 
    GO 
関連する問題