第一种:有主键的重复行,就是说主键不重复,但是记录的内容重复
比如人员表tab ,主键列id,身份证编号idcard
当身份证重复的时候,保留最小id值的记录,其他删除
delete a from tab a where exists(select 1 from tab where idcard = a.idcard and id < a.id)
第二种:没有主键的重复行,这种重复的意思是两条记录完全重复,所有字段的值都一样,而且表因为设计失误没有主键
这种可以有两种方式删除
1. 加标示列
alter table tab add id int identity(1,1) ,加上以后,这个情况就变成了第一种情况,删除语句同上
2. 中间表,把重复数据导出来,删掉原表数据,再吧数据导回去
--导出
select a,b,c,d from tab into #tab group by a, b,c,d having count(1) > 1
--删除
delete a from tab t1 inner join #tab t2 on t1.a = t2.a and t1.b = t2.b and t1.c = t2.c and t1.d = t2.d
--导回
insert into tab select * from #tab
这两种情况根据实际情况自行选用
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现