2016-09-19 205 views
2

我有一個表測試有如下數據,我想刪除trsid 124,我有數百萬條目在我的數據庫它只是一個情景。概念是從表需要使用row_number()刪除表中的重複記錄()

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

我試圖像

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 

東西刪除重複項,即使我更新查詢這是確定我

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 

但是,如果我運行這個查詢它將從表test中刪除所有記錄。如果我更新它更新兩個記錄。 我不知道我在做什麼錯在這裏

回答

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