sql server 删除重复数据 保留id大的

本文介绍了一种批量删除网页翻译中重复翻译项的方法,通过SQL语句筛选并删除了重复的Translation表中的记录,确保了翻译内容的独特性。
DELETE  FROM [Translation]  where keyid in  
(SELECT T.KeyID FROM [Translation] as T WHERE T.PageID=6088 And T.KeyID<=61866 And
T.TranslationKey IN (SELECT T1.TranslationKey FROM [Translation] as T1 GROUP BY TranslationKey HAVING COUNT(T1.TranslationKey)>1) 

AND T.KeyID NOT IN (SELECT MAX(T2.KeyID) FROM [Translation] as T2 GROUP BY T2.TranslationKey HAVING COUNT(T2.TranslationKey)>1)) 




DELETE  FROM [Translation]  where keyid in  
(SELECT T.KeyID FROM [Translation] as T WHERE T.PageID=6088 And T.KeyID<=61866 And
T.TranslationKey IN (SELECT T1.TranslationKey FROM [Translation] as T1 GROUP BY TranslationKey HAVING COUNT(T1.TranslationKey)>1) 
AND T.KeyID NOT IN (SELECT MAX(T2.KeyID) FROM [Translation] as T2 GROUP BY T2.TranslationKey HAVING COUNT(T2.TranslationKey)>1)) 


### SQL Server 去重并保留原始数据的 ID 标识列 在 SQL Server 中,处理重复数据时,如果需要保留原始数据的标识列(ID),可以通过以下方法实现。这些方法结合了标识列的特性以及 SQL Server 的功能[^1]。 #### 方法一:使用临时表存储非重复数据 可以将非重复的数据插入到临时表中,然后删除原表中的所有数据,并重新插入保留标识列值的数据。 ```sql -- 创建临时表以存储非重复数据 SELECT MIN(ID) AS ID, Name, Age INTO #TempTable FROM Student GROUP BY Name, Age; -- 删除原表中的所有数据 TRUNCATE TABLE Student; -- 将非重复数据重新插入原表 SET IDENTITY_INSERT Student ON; -- 允许显式插入标识列 INSERT INTO Student (ID, Name, Age) SELECT ID, Name, Age FROM #TempTable; SET IDENTITY_INSERT Student OFF; -- 删除临时表 DROP TABLE #TempTable; ``` 上述代码通过 `MIN(ID)` 确保每个组只保留最小的 ID,从而保留原始数据的标识列[^2]。 #### 方法二:使用 CTE 和 ROW_NUMBER() 利用公共表表达式(CTE)和 `ROW_NUMBER()` 函数,标记每组数据的第一条记录,然后删除其他重复记录。 ```sql WITH CTE AS ( SELECT ID, Name, Age, ROW_NUMBER() OVER (PARTITION BY Name, Age ORDER BY ID) AS RowNum FROM Student ) DELETE FROM Student WHERE ID IN ( SELECT ID FROM CTE WHERE RowNum > 1 ); ``` 此方法通过 `ROW_NUMBER()` 对每组数据进行编号,并删除编号于 1 的重复记录,同时保留原始数据的标识列[^3]。 #### 方法三:重建表并重新插入数据 如果允许重建表,可以先禁用标识列,删除重复数据后重新启用标识列。 ```sql -- 备份原表 SELECT * INTO StudentBackup FROM Student; -- 删除原表 DROP TABLE Student; -- 重建表并重新插入非重复数据 CREATE TABLE Student ( ID INT IDENTITY(1,1), Name NVARCHAR(50), Age INT ); INSERT INTO Student (Name, Age) SELECT DISTINCT Name, Age FROM StudentBackup; -- 删除备份表 DROP TABLE StudentBackup; ``` 这种方法适用于需要完全控制表结构的场景,但需要注意重建表可能导致外键和其他约束失效[^4]。 ### 注意事项 - 在操作前,请确保备份原始数据,以防止意外丢失。 - 如果表中存在外键约束,可能需要先禁用或删除这些约束。 - 使用 `IDENTITY_INSERT` 时,必须明确指定插入的标识列值[^5]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值