欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

SQL SERVER 删除重复内容行

程序员文章站 2023-11-20 21:35:58
对于重复行删除的问题,网上很难找到合适的答案,问问题的不少,但在搜索引擎中草草地看了一下前面的记录都没有解决方案。 其实这个问题可以很华丽的解决。 1、如果这张表没有主键(...
对于重复行删除的问题,网上很难找到合适的答案,问问题的不少,但在搜索引擎中草草地看了一下前面的记录都没有解决方案。
其实这个问题可以很华丽的解决。
1、如果这张表没有主键(或者相同的行并没有不相同的内容列),则需要新建一个自增列,用来区分不同列。例如
复制代码 代码如下:

alter table [tablename] add [tid] int identity(1,1)

就是增加一个自增量的临时列tid。

为啥要用sql语句?如果超过几十万行的话用sql server企业管理器的设计界面修改通常会超时。

2、然后就是关键了。给个例子就是我手上正要处理的ip地址所在地清单。近40万条数据,有sip和eip(开始ip和结束ip)记录重复,重复条数大概占1/5左右。对此情况用简单的一条sql命令就搞定:
复制代码 代码如下:

delete from query_ip where tid not in (select max(tid) from query_ip group by sip,eip)

就是将sip和eip分组,取得同样分组的最大的tid值。然后将原表中不在其中的内容(也就是同样分组的重复内容中更小的id内容)删除即可。
用这种思路可以延伸出很多sql解题的方式。比如说某个用户登陆表,要查看每个用户最近的登陆记录。

很优雅的一条查询语句:
复制代码 代码如下:

select * from loginlog where id in (select max(id) from loginlog group by userid)

sql强大之极,许多复杂的需求往往可以合并到一条sql语句查询中实现。因此在我的程序中除了update/insert等操作需要事务支持,或是记录量实在太大需要分页或临时表。通常都用一条sql语句来实现。比如说select *,(select count(*) from xxx where xxx=t.id) from t where...。这样就可以在select语句中获取关联的统计项,对于中小型系统尤其实用。