2017-03-17 104 views
1

我试图删除多个记录,而不单如何删除所有重复的记录,但除了一个在SQL Server

输入:

Id Temp   P_TempId 
    ------------------------------------ 
    AN #1001#.Test 5001,8001 
    AN #1001#.Test 5001,8001 
    AN #1002#.Test 5001,4001,7001,8001 
    AN #1002#.Test 5001,4001,7001,8001 
    AN #1002#.Test 5001,4001,7001,8001 

输出:

 Id Temp  P_TempId 
     --------------------------------------- 
     AN #1001#.Test 5001,8001 
     AN #1002#.Test 5001,4001,7001,8001 

回答

2

使用common table expressionrow_number()给每组Id_Temp, P_TempId编号并删除那些编号大于1的编号。

;with cte as (
    select 
     * 
    , rn = row_number() over (
      partition by Id, Temp, P_TempId 
      order by (select 1) 
      ) 
    from t 
) 
delete 
    from cte 
    where cte.rn > 1 

或不CTE,使用标准的子查询来代替:

delete s 
    from (
    select 
     * 
     , rn = row_number() over (
       partition by Id, Temp, P_TempId 
       order by (select 1) 
      ) 
    from t 
    ) as s 
    where s.rn > 1 

rextester演示:http://rextester.com/CWO44915

回报:

+----+-------------+---------------------+ 
| Id | Temp  |  P_TempId  | 
+----+-------------+---------------------+ 
| AN | #1001#.Test | 5001,8001   | 
| AN | #1002#.Test | 5001,4001,7001,8001 | 
+----+-------------+---------------------+ 
+0

没有CTE不work..can你帮助@SqlZim – Charge

+0

@Charge呃,我的错。我错过了子查询中的'from'部分。现在纠正。 – SqlZim