2016-09-19 52 views
2

次のようなデータを持つテーブルテストがあり、trsid 124を削除したいのですが、DBに何百万ものエントリがあります。コンセプトは、テーブルからrow_number()を使用してテーブルから重複レコードを削除する必要があります

-------------------------------------------- 
TrsId | ID | Name | 
--------------------------------------------  
123  | 1 | ABC  | 
124  | 1 | ABC  | 

を重複したエントリを削除することです、私は私のため

update test set id=NULL 
select T.* from 
(
    select ROW_NUMBER() over (partition by ID order by name) as r, 
      Trsid, 
      ID, 
      name 
    from test 
) t 
where r = 2 

しかし、私ならばOKですクエリを更新した場合でも、私は

delete from test 
select T.* from 
(
    select ROW_NUMBER() over (partition by ID order by name) as r, 
      Trsid, 
      ID, 
      name 
    from test 
) t 
where r = 2 

ような何かをしようとしていますこの両方のクエリを実行すると、テーブルテストのすべてのレコードが削除されます。そして私がそれを更新すれば両方のレコードを更新します。 私がここで間違っていることを知りません

答えて

2
WITH cte AS 
(
    SELECT ROW_NUMBER() OVER(PARTITION by ID ORDER BY name) AS Row 
    FROM test 
) 

DELETE FROM cte 
WHERE Row > 1 
+1

ありがとうティムそれは!!!!!!!!作品 –

0

以下のクエリを使用してください。

 ;WITH cte_1 
     AS (SELECT ROW_NUMBER() OVER(PARTITION BY ID,NAME ORDER BY TrsId) Rno,* 
       FROM YourTable) 
     DELETE 
     FROM cte_1 
     WHERE RNO>1 
-2

我々は、クエリ以下のように書くことができます重複したレコードを検索するには、

;WITH dup_val 
    AS (SELECT a, 
       b, 
       Row_number() 
        OVER( 
        partition BY a, b 
        ORDER BY b, NAME)AS [RANK] 
     FROM table_name) 
SELECT * 
FROM dup_val 
WHERE [rank] <> 1; 
+0

なぜあなたは受け入れられた答えと同じ正確な答えで一歳の質問に答えるのですか? – KinSlayerUY

関連する問題