SQL Server如何在事务中将Employee_table中的重复姓名记录迁移至Dupes表
处理重复姓名记录迁移的简易SQL方案
嘿,作为SQL新手,我特意给你准备了最直白易懂的操作步骤,完全匹配你的需求,语句简单好上手~
1. 先创建和原表结构一致的Dupes表
因为你提到Division列后还有很多列,手动写列名太麻烦,用下面的语句可以一键复制原表结构,不会带入原表数据:
SELECT * INTO Dupes FROM Employee_table WHERE 1=0;
小提示:
WHERE 1=0的作用是只复制表结构,不会把原表数据带进去,特别适合列多的场景。
2. 在事务中完成迁移操作
用事务能保证要么所有操作都成功,要么全部回滚,绝对不会出现一半数据移走、一半留在原表的尴尬情况:
BEGIN TRANSACTION; -- 第一步:把所有重复姓名的记录插入Dupes表 INSERT INTO Dupes SELECT * FROM Employee_table WHERE CONCAT(FirstName, ' ', LastName) IN ( SELECT CONCAT(FirstName, ' ', LastName) FROM Employee_table GROUP BY FirstName, LastName HAVING COUNT(*) > 1 -- 筛选出出现2次及以上的姓名 ); -- 第二步:从原表删除这些已迁移的记录 DELETE FROM Employee_table WHERE CONCAT(FirstName, ' ', LastName) IN ( SELECT CONCAT(FirstName, ' ', LastName) FROM Dupes ); -- 如果确认操作没问题,就提交事务;如果出错,把下面的COMMIT改成ROLLBACK就能撤销所有操作 COMMIT TRANSACTION;
新手友好的补充说明
- 关于字符串拼接:如果用的是SQL Server,把
CONCAT换成FirstName + ' ' + LastName就行;MySQL和PostgreSQL用CONCAT是通用写法。 - 为什么用Dupes表关联删除?这样不用重复执行分组统计,效率更高,也更不容易出错。
- 事务的重要性:比如插入Dupes表成功了,但删除原表时出错,执行
ROLLBACK TRANSACTION就能把数据恢复到操作前的状态,安全又可靠。
内容的提问来源于stack exchange,提问作者bigShaq
相关产品推荐
相关产品推荐

