删除重复记录并在sql中的另一个表中插入已删除的id

删除重复记录并在sql中的另一个表中插入已删除的id,sql,sql-server-2008,Sql,Sql Server 2008,我有以下格式的表格: 表名:PartAtt 我有一部分 Id | Type | Name ----------------------- 1 | 2 | Bed 2 | 7 | Bed 3 | 6 | Sofa 4 | 5 | Chair 5 | 2 | Bed 6 | 8 | Chair 7 | 2 | Bed

我有以下格式的表格:

表名:PartAtt

我有一部分

Id   |   Type   |  Name
-----------------------
1    |    2     |   Bed
2    |    7     |   Bed
3    |    6     |   Sofa
4    |    5     |   Chair
5    |    2     |   Bed
6    |    8     |   Chair
7    |    2     |   Bed
所以我的问题是,我不能在这个表上有多个同名的类型id,我需要清理它,所以我需要保留最大的id,然后将坏的id连同保存的id一起转储到临时表中。例如:

清理完桌子后,我应该有:

Table PartAtt                       #tempTable
    Id   |   Type   |  Name         Id    |   updateId
    -----------------------        --------------------   
    3    |    6     |   Sofa         1    |     7  
    4    |    5     |   Chair        2    |     7
    6    |    8     |   Chair        5    |     7
    7    |    2     |   Bed
到目前为止,我能做的就是找到临时表中的项目

CREATE TABLE #tempTable(
 Type int,
 Name varcahar(500)
 )

INSERT INTO #tempTable (Type, Name)
    SELECT Type,Name
        FROM PartAtt
     GROUP BY Type,Name
  HAVING COUNT(Name) > 1 && COUNT(Type) > 1     
我用它来知道哪些项有问题,但我不知道如何删除两次类型和名称的最旧记录,并像上面那样将它们插入临时表中

我希望你能给我一些建议和建议。

排号将是你今晚的朋友

通过按名称进行分区,可以为每个重复项分配一个递增的编号。然后保留行=1的项目,并转储其余的项目

保留这些:

select * from 
(
    select *, 
           ROW_NUMBER() over (partition by Name order by ID DESC) as Row
    from PartAtt
) as Temp
where Row = 1
转储这些:

select * from 
(
    select *,
           ROW_NUMBER() over (partition by Name order by ID DESC) as Row 
    from PartAtt
) as Temp
where Row != 1
试试下面的SQL:

备份表

备份要删除的重复行

删除重复行


我认为提供的数据中存在一些错误。。床的类型为2,但原始表格第二行给出了7。。
CREATE TABLE deleted_PartAtt(Id int, updateId int, Name char(10));
INSERT INTO deleted_PartAtt SELECT DISTINCT t1.Id, '', t1.Name FROM PartAtt t1
INNER JOIN PartAtt t2
ON t1.Type = t2.Type AND t1.Name = t2.Name AND t1.Id < t2.Id;


UPDATE dp SET dp.updateId = a.Id FROM deleted_PartAtt dp INNER JOIN (SELECT max(t1.Id) AS Id, t1.Name FROM PartAtt t1 INNER JOIN deleted_PartAtt t2
ON t1.Name = t2.Name GROUP BY t1.Name) a ON a.Name = dp.Name;
DELETE t1 FROM PartAtt t1
INNER JOIN PartAtt t2
ON t1.Type = t2.Type AND t1.Name = t2.Name AND t1.Id < t2.Id;