删除重复记录并在sql中的另一个表中插入已删除的id
我有以下格式的表格: 表名:PartAtt 我有一部分删除重复记录并在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
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;